2 * Draw two quads, one using only a vertex shader, the other only with a
3 * fragment shader. They should appear the same.
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 VertProgram
; /* w/out vertex shader */
26 static GLuint FragProgram
; /* w/out fragment shader */
34 glColor3f(1, 0, 0); glVertex2f(-1, -1);
35 glColor3f(0, 1, 0); glVertex2f( 1, -1);
36 glColor3f(0, 0, 1); glVertex2f( 1, 1);
37 glColor3f(1, 0, 1); glVertex2f(-1, 1);
42 /** as above, but specify color via texcoords */
47 glTexCoord3f(1, 0, 0); glVertex2f(-1, -1);
48 glTexCoord3f(0, 1, 0); glVertex2f( 1, -1);
49 glTexCoord3f(0, 0, 1); glVertex2f( 1, 1);
50 glTexCoord3f(1, 0, 1); glVertex2f(-1, 1);
58 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
60 /* render with vertex shader only */
61 glUseProgram_func(VertProgram
);
63 glTranslatef(-1.5, 0, 0);
67 /* render with fragment shader only */
68 glUseProgram_func(FragProgram
);
70 glTranslatef(+1.5, 0, 0);
79 Reshape(int width
, int height
)
81 glViewport(0, 0, width
, height
);
82 glMatrixMode(GL_PROJECTION
);
84 glOrtho(-4, 4, -2, 2, -1, 1);
85 glMatrixMode(GL_MODELVIEW
);
93 glDeleteShader_func(FragShader
);
94 glDeleteShader_func(VertShader
);
95 glDeleteProgram_func(VertProgram
);
96 glDeleteProgram_func(FragProgram
);
97 glutDestroyWindow(Win
);
102 Key(unsigned char key
, int x
, int y
)
119 static const char *fragShaderText
=
121 " gl_FragColor = gl_Color;\n"
123 static const char *vertShaderText
=
125 " gl_Position = ftransform();\n"
126 " gl_FrontColor = gl_MultiTexCoord0;\n" /* see DrawQuadTex() */
129 if (!ShadersSupported())
135 FragShader
= CompileShaderFile(GL_FRAGMENT_SHADER
, FragProgFile
);
137 FragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
140 VertShader
= CompileShaderFile(GL_VERTEX_SHADER
, VertProgFile
);
142 VertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
144 VertProgram
= LinkShaders(VertShader
, 0);
145 FragProgram
= LinkShaders(0, FragShader
);
147 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
148 glEnable(GL_DEPTH_TEST
);
150 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
152 assert(glIsProgram_func(VertProgram
));
153 assert(glIsProgram_func(FragProgram
));
154 assert(glIsShader_func(FragShader
));
155 assert(glIsShader_func(VertShader
));
162 ParseOptions(int argc
, char *argv
[])
165 for (i
= 1; i
< argc
; i
++) {
166 if (strcmp(argv
[i
], "-fs") == 0) {
167 FragProgFile
= argv
[i
+1];
169 else if (strcmp(argv
[i
], "-vs") == 0) {
170 VertProgFile
= argv
[i
+1];
177 main(int argc
, char *argv
[])
179 glutInit(&argc
, argv
);
180 glutInitWindowPosition( 0, 0);
181 glutInitWindowSize(400, 200);
182 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
183 Win
= glutCreateWindow(argv
[0]);
184 glutReshapeFunc(Reshape
);
185 glutKeyboardFunc(Key
);
186 glutDisplayFunc(Redisplay
);
187 ParseOptions(argc
, argv
);