2 * Test linking of multiple compilation units.
13 #include "glut_wrap.h"
14 #include "shaderutil.h"
17 static GLfloat diffuse
[4] = { 0.5f
, 1.0f
, 0.5f
, 1.0f
};
18 static GLfloat specular
[4] = { 0.8f
, 0.8f
, 0.8f
, 1.0f
};
19 static GLfloat lightPos
[4] = { 0.0f
, 10.0f
, 20.0f
, 0.0f
};
20 static GLfloat delta
= 1.0f
;
22 static GLuint VertShader1
;
23 static GLuint VertShader2
;
24 static GLuint FragShader1
;
25 static GLuint FragShader2
;
26 static GLuint Program
;
28 static GLint uDiffuse
;
29 static GLint uSpecular
;
30 static GLint uTexture
;
33 static GLboolean anim
= GL_TRUE
;
37 static const char *FragShaderSource1
=
38 "float compute_dotprod(const vec3 normal) \n"
40 " float dotProd = max(dot(gl_LightSource[0].position.xyz, \n"
41 " normalize(normal)), 0.0); \n"
45 static const char *FragShaderSource2
=
46 "uniform vec4 diffuse;\n"
47 "uniform vec4 specular;\n"
48 "varying vec3 normal;\n"
50 "// external function \n"
51 "float compute_dotprod(const vec3 normal); \n"
55 " float dotProd = compute_dotprod(normal); \n"
56 " gl_FragColor = diffuse * dotProd + specular * pow(dotProd, 20.0); \n"
60 static const char *VertShaderSource1
=
61 "vec3 compute_normal() \n"
63 " return gl_NormalMatrix * gl_Normal; \n"
66 static const char *VertShaderSource2
=
67 "varying vec3 normal;\n"
69 "// external function \n"
70 "vec3 compute_normal(); \n"
74 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n"
75 " normal = compute_normal(); \n"
80 normalize(GLfloat
*dst
, const GLfloat
*src
)
82 GLfloat len
= sqrt(src
[0] * src
[0] + src
[1] * src
[1] + src
[2] * src
[2]);
83 dst
[0] = src
[0] / len
;
84 dst
[1] = src
[1] / len
;
85 dst
[2] = src
[2] / len
;
95 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
97 /* update light position */
98 normalize(vec
, lightPos
);
99 glLightfv(GL_LIGHT0
, GL_POSITION
, vec
);
101 glutSolidSphere(2.0, 10, 5);
110 lightPos
[0] += delta
;
111 if (lightPos
[0] > 25.0f
|| lightPos
[0] < -25.0f
)
118 Reshape(int width
, int height
)
120 glViewport(0, 0, width
, height
);
121 glMatrixMode(GL_PROJECTION
);
123 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
124 glMatrixMode(GL_MODELVIEW
);
126 glTranslatef(0.0f
, 0.0f
, -15.0f
);
133 glDeleteShader(VertShader1
);
134 glDeleteShader(VertShader2
);
135 glDeleteShader(FragShader1
);
136 glDeleteShader(FragShader2
);
137 glDeleteProgram(Program
);
138 glutDestroyWindow(Win
);
143 Key(unsigned char key
, int x
, int y
)
173 CheckLink(GLuint prog
)
176 glGetProgramiv(prog
, GL_LINK_STATUS
, &stat
);
180 glGetProgramInfoLog(prog
, 1000, &len
, log
);
181 fprintf(stderr
, "Linker error:\n%s\n", log
);
189 if (!ShadersSupported())
192 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
194 VertShader1
= CompileShaderText(GL_VERTEX_SHADER
, VertShaderSource1
);
195 VertShader2
= CompileShaderText(GL_VERTEX_SHADER
, VertShaderSource2
);
196 FragShader1
= CompileShaderText(GL_FRAGMENT_SHADER
, FragShaderSource1
);
197 FragShader2
= CompileShaderText(GL_FRAGMENT_SHADER
, FragShaderSource2
);
199 Program
= glCreateProgram();
200 glAttachShader(Program
, VertShader1
);
201 glAttachShader(Program
, VertShader2
);
202 glAttachShader(Program
, FragShader1
);
203 glAttachShader(Program
, FragShader2
);
205 glLinkProgram(Program
);
209 glUseProgram(Program
);
211 uDiffuse
= glGetUniformLocation(Program
, "diffuse");
212 uSpecular
= glGetUniformLocation(Program
, "specular");
213 uTexture
= glGetUniformLocation(Program
, "texture");
214 printf("DiffusePos %d SpecularPos %d TexturePos %d\n",
215 uDiffuse
, uSpecular
, uTexture
);
217 glUniform4fv(uDiffuse
, 1, diffuse
);
218 glUniform4fv(uSpecular
, 1, specular
);
220 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
221 glEnable(GL_DEPTH_TEST
);
223 glMaterialfv(GL_FRONT_AND_BACK
, GL_DIFFUSE
, diffuse
);
224 glMaterialfv(GL_FRONT_AND_BACK
, GL_SPECULAR
, specular
);
225 glMaterialf(GL_FRONT_AND_BACK
, GL_SHININESS
, 10.0f
);
227 assert(glIsProgram(Program
));
228 assert(glIsShader(VertShader1
));
229 assert(glIsShader(VertShader2
));
230 assert(glIsShader(FragShader1
));
231 assert(glIsShader(FragShader2
));
238 main(int argc
, char *argv
[])
240 glutInit(&argc
, argv
);
241 glutInitWindowSize(300, 300);
242 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
243 Win
= glutCreateWindow(argv
[0]);
245 glutReshapeFunc(Reshape
);
246 glutKeyboardFunc(Key
);
247 glutDisplayFunc(Redisplay
);