2 * Test GLSL 1.20 gl_PointCoord fragment program attribute.
15 #include "shaderutil.h"
18 static GLint WinWidth
= 300, WinHeight
= 300;
19 static char *FragProgFile
= NULL
;
20 static char *VertProgFile
= NULL
;
21 static GLuint fragShader
;
22 static GLuint vertShader
;
23 static GLuint program
;
26 static GLenum Filter
= GL_NEAREST
;
32 glClear(GL_COLOR_BUFFER_BIT
);
34 /* draw one point/sprite */
38 glVertex2f(WinWidth
/ 2.0f
, WinHeight
/ 2.0f
);
47 Reshape(int width
, int height
)
49 glViewport(0, 0, width
, height
);
50 glMatrixMode(GL_PROJECTION
);
52 glOrtho(0, width
, 0, height
, -1, 1);
54 glMatrixMode(GL_MODELVIEW
);
65 glDeleteShader(fragShader
);
66 glDeleteShader(vertShader
);
67 glDeleteProgram(program
);
68 glutDestroyWindow(win
);
73 Key(unsigned char key
, int x
, int y
)
93 GLubyte image
[SZ
][SZ
][4];
96 for (i
= 0; i
< SZ
; i
++) {
97 for (j
= 0; j
< SZ
; j
++) {
102 image
[i
][j
][3] = 255;
105 image
[i
][j
][0] = j
* 255 / (SZ
-1);
106 image
[i
][j
][1] = i
* 255 / (SZ
-1);
108 image
[i
][j
][3] = 255;
113 glActiveTexture(GL_TEXTURE0
); /* unit 0 */
114 glBindTexture(GL_TEXTURE_2D
, 42);
115 glTexImage2D(GL_TEXTURE_2D
, 0, GL_RGBA
, SZ
, SZ
, 0,
116 GL_RGBA
, GL_UNSIGNED_BYTE
, image
);
117 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, Filter
);
118 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, Filter
);
119 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_CLAMP_TO_EDGE
);
120 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_CLAMP_TO_EDGE
);
128 static const char *fragShaderText
=
130 "uniform sampler2D tex0; \n"
132 " gl_FragColor = texture2D(tex0, gl_PointCoord.xy, 0.0); \n"
134 static const char *vertShaderText
=
136 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
139 if (!ShadersSupported())
142 vertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
143 fragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
144 program
= LinkShaders(vertShader
, fragShader
);
146 glUseProgram(program
);
148 tex0
= glGetUniformLocation(program
, "tex0");
149 printf("Uniforms: tex0: %d\n", tex0
);
151 glUniform1i(tex0
, 0); /* tex unit 0 */
153 /*assert(glGetError() == 0);*/
155 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
157 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
159 assert(glIsProgram(program
));
160 assert(glIsShader(fragShader
));
161 assert(glIsShader(vertShader
));
165 glEnable(GL_POINT_SPRITE
);
172 ParseOptions(int argc
, char *argv
[])
175 for (i
= 1; i
< argc
; i
++) {
176 if (strcmp(argv
[i
], "-fs") == 0) {
177 FragProgFile
= argv
[i
+1];
179 else if (strcmp(argv
[i
], "-vs") == 0) {
180 VertProgFile
= argv
[i
+1];
187 main(int argc
, char *argv
[])
189 glutInit(&argc
, argv
);
190 glutInitWindowSize(WinWidth
, WinHeight
);
191 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
);
192 win
= glutCreateWindow(argv
[0]);
194 glutReshapeFunc(Reshape
);
195 glutKeyboardFunc(Key
);
196 glutDisplayFunc(Redisplay
);
197 ParseOptions(argc
, argv
);