2 * Test GLSL 1.20 gl_PointCoord fragment program attribute.
18 #include "shaderutil.h"
21 static GLint WinWidth
= 300, WinHeight
= 300;
22 static char *FragProgFile
= NULL
;
23 static char *VertProgFile
= NULL
;
24 static GLuint fragShader
;
25 static GLuint vertShader
;
26 static GLuint program
;
29 static GLenum Filter
= GL_NEAREST
;
35 glClear(GL_COLOR_BUFFER_BIT
);
37 /* draw one point/sprite */
41 glVertex2f(WinWidth
/ 2.0f
, WinHeight
/ 2.0f
);
50 Reshape(int width
, int height
)
52 glViewport(0, 0, width
, height
);
53 glMatrixMode(GL_PROJECTION
);
55 glOrtho(0, width
, 0, height
, -1, 1);
57 glMatrixMode(GL_MODELVIEW
);
68 glDeleteShader_func(fragShader
);
69 glDeleteShader_func(vertShader
);
70 glDeleteProgram_func(program
);
71 glutDestroyWindow(win
);
76 Key(unsigned char key
, int x
, int y
)
96 GLubyte image
[SZ
][SZ
][4];
99 for (i
= 0; i
< SZ
; i
++) {
100 for (j
= 0; j
< SZ
; j
++) {
105 image
[i
][j
][3] = 255;
108 image
[i
][j
][0] = j
* 255 / (SZ
-1);
109 image
[i
][j
][1] = i
* 255 / (SZ
-1);
111 image
[i
][j
][3] = 255;
116 glActiveTexture(GL_TEXTURE0
); /* unit 0 */
117 glBindTexture(GL_TEXTURE_2D
, 42);
118 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, SZ
, SZ
, 0,
119 GL_RGBA
, GL_UNSIGNED_BYTE
, image
);
120 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, Filter
);
121 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, Filter
);
122 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
123 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
131 static const char *fragShaderText
=
133 "uniform sampler2D tex0; \n"
135 " gl_FragColor = texture2D(tex0, gl_PointCoord.xy, 0.0); \n"
137 static const char *vertShaderText
=
139 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
142 if (!ShadersSupported())
147 vertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
148 fragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
149 program
= LinkShaders(vertShader
, fragShader
);
151 glUseProgram_func(program
);
153 tex0
= glGetUniformLocation_func(program
, "tex0");
154 printf("Uniforms: tex0: %d\n", tex0
);
156 glUniform1i_func(tex0
, 0); /* tex unit 0 */
158 /*assert(glGetError() == 0);*/
160 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
162 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
164 assert(glIsProgram_func(program
));
165 assert(glIsShader_func(fragShader
));
166 assert(glIsShader_func(vertShader
));
170 glEnable(GL_POINT_SPRITE
);
177 ParseOptions(int argc
, char *argv
[])
180 for (i
= 1; i
< argc
; i
++) {
181 if (strcmp(argv
[i
], "-fs") == 0) {
182 FragProgFile
= argv
[i
+1];
184 else if (strcmp(argv
[i
], "-vs") == 0) {
185 VertProgFile
= argv
[i
+1];
192 main(int argc
, char *argv
[])
194 glutInit(&argc
, argv
);
195 glutInitWindowPosition( 0, 0);
196 glutInitWindowSize(WinWidth
, WinHeight
);
197 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
);
198 win
= glutCreateWindow(argv
[0]);
200 glutReshapeFunc(Reshape
);
201 glutKeyboardFunc(Key
);
202 glutDisplayFunc(Redisplay
);
203 ParseOptions(argc
, argv
);