2 * Implement glRasterPos + glBitmap with textures + shaders.
16 #include "shaderutil.h"
19 static GLuint FragShader
;
20 static GLuint VertShader
;
21 static GLuint Program
;
24 static GLint WinWidth
= 500, WinHeight
= 500;
25 static GLboolean Anim
= GL_TRUE
;
26 static GLboolean Bitmap
= GL_FALSE
;
27 static GLfloat Xrot
= 20.0f
, Yrot
= 70.0f
;
28 static GLint uTex
, uScale
;
29 static GLuint Textures
[2];
36 BitmapText(const char *s
)
39 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
48 static const GLfloat px
[3] = { 1.2, 0, 0};
49 static const GLfloat nx
[3] = {-1.2, 0, 0};
51 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
54 glRotatef(Xrot
, 1.0f
, 0.0f
, 0.0f
);
55 glRotatef(Yrot
, 0.0f
, 1.0f
, 0.0f
);
57 glEnable(GL_LIGHTING
);
60 glScalef(0.5, 0.5, 0.5);
61 glutSolidDodecahedron();
64 glDisable(GL_LIGHTING
);
81 glUseProgram_func(Program
);
83 /* vertex positions (deltas) depend on texture size and window size */
85 glUniform2f_func(uScale
,
86 2.0 * TEX_WIDTH
/ WinWidth
,
87 2.0 * TEX_HEIGHT
/ WinHeight
);
91 glBindTexture(GL_TEXTURE_2D
, Textures
[0]);
93 glTexCoord2f(0, 0); glVertex3fv(px
);
94 glTexCoord2f(1, 0); glVertex3fv(px
);
95 glTexCoord2f(1, 1); glVertex3fv(px
);
96 glTexCoord2f(0, 1); glVertex3fv(px
);
100 glBindTexture(GL_TEXTURE_2D
, Textures
[1]);
102 glTexCoord2f(0, 0); glVertex3fv(nx
);
103 glTexCoord2f(1, 0); glVertex3fv(nx
);
104 glTexCoord2f(1, 1); glVertex3fv(nx
);
105 glTexCoord2f(0, 1); glVertex3fv(nx
);
108 glUseProgram_func(0);
120 Yrot
= glutGet(GLUT_ELAPSED_TIME
) * 0.01;
126 Reshape(int width
, int height
)
130 glViewport(0, 0, width
, height
);
131 glMatrixMode(GL_PROJECTION
);
133 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
134 glMatrixMode(GL_MODELVIEW
);
136 glTranslatef(0.0f
, 0.0f
, -10.0f
);
141 Key(unsigned char key
, int x
, int y
)
158 printf("Using glBitmap\n");
160 printf("Using billboard texture\n");
163 glDeleteShader_func(FragShader
);
164 glDeleteShader_func(VertShader
);
165 glDeleteProgram_func(Program
);
166 glutDestroyWindow(Win
);
174 SpecialKey(int key
, int x
, int y
)
176 const GLfloat step
= 0.125f
;
191 /*printf("Xrot: %f Yrot: %f\n", Xrot, Yrot);*/
197 MakeTexImage(const char *p
, GLuint texobj
)
199 GLubyte image
[TEX_HEIGHT
][TEX_WIDTH
];
202 for (i
= 0; i
< TEX_HEIGHT
; i
++) {
203 for (j
= 0; j
< TEX_WIDTH
; j
++) {
204 k
= i
* TEX_WIDTH
+ j
;
214 glBindTexture(GL_TEXTURE_2D
, texobj
);
215 glTexImage2D(GL_TEXTURE_2D
, 0, GL_INTENSITY
, TEX_WIDTH
, TEX_HEIGHT
, 0,
216 GL_RED
, GL_UNSIGNED_BYTE
, image
);
217 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAX_LEVEL
, 1);
218 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
219 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
224 MakeBitmapTextures(void)
244 glGenTextures(2, Textures
);
245 MakeTexImage(px
, Textures
[0]);
246 MakeTexImage(nx
, Textures
[1]);
253 /* Fragment shader: modulate raster color by texture, discard fragments
256 static const char *fragShaderText
=
257 "uniform sampler2D tex2d; \n"
259 " vec4 c = texture2D(tex2d, gl_TexCoord[0].xy); \n"
262 " gl_FragColor = c * gl_Color; \n"
264 /* Vertex shader: compute new vertex position based on incoming vertex pos,
265 * texcoords and special scale factor.
267 static const char *vertShaderText
=
268 "uniform vec2 scale; \n"
270 " vec4 p = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
271 " gl_Position.xy = p.xy + gl_MultiTexCoord0.xy * scale * p.w; \n"
272 " gl_Position.zw = p.zw; \n"
273 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
274 " gl_FrontColor = gl_Color; \n"
277 if (!ShadersSupported())
282 VertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
283 FragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
284 Program
= LinkShaders(VertShader
, FragShader
);
286 glUseProgram_func(Program
);
288 uScale
= glGetUniformLocation_func(Program
, "scale");
289 uTex
= glGetUniformLocation_func(Program
, "tex2d");
291 glUniform1i_func(uTex
, 0); /* tex unit 0 */
294 glUseProgram_func(0);
296 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
297 glEnable(GL_DEPTH_TEST
);
298 glEnable(GL_NORMALIZE
);
301 MakeBitmapTextures();
306 main(int argc
, char *argv
[])
308 glutInit(&argc
, argv
);
309 glutInitWindowSize(WinWidth
, WinHeight
);
310 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
311 Win
= glutCreateWindow(argv
[0]);
312 glutReshapeFunc(Reshape
);
313 glutKeyboardFunc(Key
);
314 glutSpecialFunc(SpecialKey
);
315 glutDisplayFunc(Redisplay
);