2 * Draw two quads, one using only a vertex shader, the other only with a
3 * fragment shader. They should appear the same.
19 #include "shaderutil.h"
22 static char *FragProgFile
= NULL
;
23 static char *VertProgFile
= NULL
;
24 static GLuint FragShader
;
25 static GLuint VertShader
;
26 static GLuint VertProgram
; /* w/out vertex shader */
27 static GLuint FragProgram
; /* w/out fragment shader */
35 glColor3f(1, 0, 0); glVertex2f(-1, -1);
36 glColor3f(0, 1, 0); glVertex2f( 1, -1);
37 glColor3f(0, 0, 1); glVertex2f( 1, 1);
38 glColor3f(1, 0, 1); glVertex2f(-1, 1);
43 /** as above, but specify color via texcoords */
48 glTexCoord3f(1, 0, 0); glVertex2f(-1, -1);
49 glTexCoord3f(0, 1, 0); glVertex2f( 1, -1);
50 glTexCoord3f(0, 0, 1); glVertex2f( 1, 1);
51 glTexCoord3f(1, 0, 1); glVertex2f(-1, 1);
59 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
61 /* render with vertex shader only */
62 glUseProgram_func(VertProgram
);
64 glTranslatef(-1.5, 0, 0);
68 /* render with fragment shader only */
69 glUseProgram_func(FragProgram
);
71 glTranslatef(+1.5, 0, 0);
80 Reshape(int width
, int height
)
82 glViewport(0, 0, width
, height
);
83 glMatrixMode(GL_PROJECTION
);
85 glOrtho(-4, 4, -2, 2, -1, 1);
86 glMatrixMode(GL_MODELVIEW
);
94 glDeleteShader_func(FragShader
);
95 glDeleteShader_func(VertShader
);
96 glDeleteProgram_func(VertProgram
);
97 glDeleteProgram_func(FragProgram
);
98 glutDestroyWindow(Win
);
103 Key(unsigned char key
, int x
, int y
)
120 static const char *fragShaderText
=
122 " gl_FragColor = gl_Color;\n"
124 static const char *vertShaderText
=
126 " gl_Position = ftransform();\n"
127 " gl_FrontColor = gl_MultiTexCoord0;\n" /* see DrawQuadTex() */
130 if (!ShadersSupported())
136 FragShader
= CompileShaderFile(GL_FRAGMENT_SHADER
, FragProgFile
);
138 FragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
141 VertShader
= CompileShaderFile(GL_VERTEX_SHADER
, VertProgFile
);
143 VertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
145 VertProgram
= LinkShaders(VertShader
, 0);
146 FragProgram
= LinkShaders(0, FragShader
);
148 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
149 glEnable(GL_DEPTH_TEST
);
151 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
153 assert(glIsProgram_func(VertProgram
));
154 assert(glIsProgram_func(FragProgram
));
155 assert(glIsShader_func(FragShader
));
156 assert(glIsShader_func(VertShader
));
163 ParseOptions(int argc
, char *argv
[])
166 for (i
= 1; i
< argc
; i
++) {
167 if (strcmp(argv
[i
], "-fs") == 0) {
168 FragProgFile
= argv
[i
+1];
170 else if (strcmp(argv
[i
], "-vs") == 0) {
171 VertProgFile
= argv
[i
+1];
178 main(int argc
, char *argv
[])
180 glutInit(&argc
, argv
);
181 glutInitWindowPosition( 0, 0);
182 glutInitWindowSize(400, 200);
183 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
184 Win
= glutCreateWindow(argv
[0]);
186 glutReshapeFunc(Reshape
);
187 glutKeyboardFunc(Key
);
188 glutDisplayFunc(Redisplay
);
189 ParseOptions(argc
, argv
);