2 * Draw two quads, one using only a vertex shader, the other only with a
3 * fragment shader. They should appear the same.
16 #include "shaderutil.h"
19 static char *FragProgFile
= NULL
;
20 static char *VertProgFile
= NULL
;
21 static GLuint FragShader
;
22 static GLuint VertShader
;
23 static GLuint VertProgram
; /* w/out vertex shader */
24 static GLuint FragProgram
; /* w/out fragment shader */
32 glColor3f(1, 0, 0); glVertex2f(-1, -1);
33 glColor3f(0, 1, 0); glVertex2f( 1, -1);
34 glColor3f(0, 0, 1); glVertex2f( 1, 1);
35 glColor3f(1, 0, 1); glVertex2f(-1, 1);
40 /** as above, but specify color via texcoords */
45 glTexCoord3f(1, 0, 0); glVertex2f(-1, -1);
46 glTexCoord3f(0, 1, 0); glVertex2f( 1, -1);
47 glTexCoord3f(0, 0, 1); glVertex2f( 1, 1);
48 glTexCoord3f(1, 0, 1); glVertex2f(-1, 1);
56 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
58 /* render with vertex shader only */
59 glUseProgram(VertProgram
);
61 glTranslatef(-1.5, 0, 0);
65 /* render with fragment shader only */
66 glUseProgram(FragProgram
);
68 glTranslatef(+1.5, 0, 0);
77 Reshape(int width
, int height
)
79 glViewport(0, 0, width
, height
);
80 glMatrixMode(GL_PROJECTION
);
82 glOrtho(-4, 4, -2, 2, -1, 1);
83 glMatrixMode(GL_MODELVIEW
);
91 glDeleteShader(FragShader
);
92 glDeleteShader(VertShader
);
93 glDeleteProgram(VertProgram
);
94 glDeleteProgram(FragProgram
);
95 glutDestroyWindow(Win
);
100 Key(unsigned char key
, int x
, int y
)
117 static const char *fragShaderText
=
119 " gl_FragColor = gl_Color;\n"
121 static const char *vertShaderText
=
123 " gl_Position = ftransform();\n"
124 " gl_FrontColor = gl_MultiTexCoord0;\n" /* see DrawQuadTex() */
127 if (!ShadersSupported())
131 FragShader
= CompileShaderFile(GL_FRAGMENT_SHADER
, FragProgFile
);
133 FragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
136 VertShader
= CompileShaderFile(GL_VERTEX_SHADER
, VertProgFile
);
138 VertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
140 VertProgram
= LinkShaders(VertShader
, 0);
141 FragProgram
= LinkShaders(0, FragShader
);
143 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
144 glEnable(GL_DEPTH_TEST
);
146 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
148 assert(glIsProgram(VertProgram
));
149 assert(glIsProgram(FragProgram
));
150 assert(glIsShader(FragShader
));
151 assert(glIsShader(VertShader
));
158 ParseOptions(int argc
, char *argv
[])
161 for (i
= 1; i
< argc
; i
++) {
162 if (strcmp(argv
[i
], "-fs") == 0) {
163 FragProgFile
= argv
[i
+1];
165 else if (strcmp(argv
[i
], "-vs") == 0) {
166 VertProgFile
= argv
[i
+1];
173 main(int argc
, char *argv
[])
175 glutInit(&argc
, argv
);
176 glutInitWindowSize(400, 200);
177 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
178 Win
= glutCreateWindow(argv
[0]);
180 glutReshapeFunc(Reshape
);
181 glutKeyboardFunc(Key
);
182 glutDisplayFunc(Redisplay
);
183 ParseOptions(argc
, argv
);