2 * Test OpenGL 2.0 dx/dy functions for texcoords.
6 * NOTE: resize the window to observe how the partial derivatives of
7 * the texcoords change.
18 #include "shaderutil.h"
21 static char *FragProgFile
= NULL
;
22 static char *VertProgFile
= NULL
;
23 static GLuint fragShader
;
24 static GLuint vertShader
;
25 static GLuint program
;
26 static GLuint SphereList
, RectList
, CurList
;
28 static GLboolean anim
= GL_TRUE
;
29 static GLfloat xRot
= 0.0f
, yRot
= 0.0f
;
35 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
38 glRotatef(xRot
, 1.0f
, 0.0f
, 0.0f
);
39 glRotatef(yRot
, 0.0f
, 1.0f
, 0.0f
);
50 yRot
= glutGet(GLUT_ELAPSED_TIME
) * 0.1;
56 Reshape(int width
, int height
)
58 glViewport(0, 0, width
, height
);
59 glMatrixMode(GL_PROJECTION
);
61 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
62 glMatrixMode(GL_MODELVIEW
);
64 glTranslatef(0.0f
, 0.0f
, -15.0f
);
71 glDeleteShader(fragShader
);
72 glDeleteShader(vertShader
);
73 glDeleteProgram(program
);
74 glutDestroyWindow(win
);
79 Key(unsigned char key
, int x
, int y
)
94 if (CurList
== SphereList
)
109 SpecialKey(int key
, int x
, int y
)
111 const GLfloat step
= 3.0f
;
137 GLUquadricObj
*obj
= gluNewQuadric();
138 SphereList
= glGenLists(1);
139 gluQuadricTexture(obj
, GL_TRUE
);
140 glNewList(SphereList
, GL_COMPILE
);
141 gluSphere(obj
, 2.0f
, 30, 15);
143 gluDeleteQuadric(obj
);
150 RectList
= glGenLists(1);
151 glNewList(RectList
, GL_COMPILE
);
153 glTexCoord2f(0, 0); glVertex2f(-2, -2);
154 glTexCoord2f(1, 0); glVertex2f( 2, -2);
155 glTexCoord2f(1, 1); glVertex2f( 2, 2);
156 glTexCoord2f(0, 1); glVertex2f(-2, 2);
165 static const char *fragShaderText
=
167 " gl_FragColor = abs(dFdy(gl_TexCoord[0])) * 50.0;\n"
168 " // gl_FragColor = gl_TexCoord[0];\n"
170 static const char *vertShaderText
=
172 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
173 " gl_TexCoord[0] = gl_MultiTexCoord0;\n"
176 if (!ShadersSupported())
179 vertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
180 fragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
181 program
= LinkShaders(vertShader
, fragShader
);
183 glUseProgram(program
);
185 /*assert(glGetError() == 0);*/
187 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
188 glEnable(GL_DEPTH_TEST
);
193 CurList
= SphereList
;
195 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
197 assert(glIsProgram(program
));
198 assert(glIsShader(fragShader
));
199 assert(glIsShader(vertShader
));
206 ParseOptions(int argc
, char *argv
[])
209 for (i
= 1; i
< argc
; i
++) {
210 if (strcmp(argv
[i
], "-fs") == 0) {
211 FragProgFile
= argv
[i
+1];
213 else if (strcmp(argv
[i
], "-vs") == 0) {
214 VertProgFile
= argv
[i
+1];
221 main(int argc
, char *argv
[])
223 glutInit(&argc
, argv
);
224 glutInitWindowSize(200, 200);
225 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
226 win
= glutCreateWindow(argv
[0]);
228 glutReshapeFunc(Reshape
);
229 glutKeyboardFunc(Key
);
230 glutSpecialFunc(SpecialKey
);
231 glutDisplayFunc(Redisplay
);
234 ParseOptions(argc
, argv
);