2 * Implement glRasterPos + glBitmap with textures + shaders.
17 #include "shaderutil.h"
20 static GLuint FragShader
;
21 static GLuint VertShader
;
22 static GLuint Program
;
25 static GLint WinWidth
= 500, WinHeight
= 500;
26 static GLboolean Anim
= GL_TRUE
;
27 static GLboolean Bitmap
= GL_FALSE
;
28 static GLfloat Xrot
= 20.0f
, Yrot
= 70.0f
;
29 static GLint uTex
, uScale
;
30 static GLuint Textures
[2];
37 BitmapText(const char *s
)
40 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
49 static const GLfloat px
[3] = { 1.2, 0, 0};
50 static const GLfloat nx
[3] = {-1.2, 0, 0};
52 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
55 glRotatef(Xrot
, 1.0f
, 0.0f
, 0.0f
);
56 glRotatef(Yrot
, 0.0f
, 1.0f
, 0.0f
);
58 glEnable(GL_LIGHTING
);
61 glScalef(0.5, 0.5, 0.5);
62 glutSolidDodecahedron();
65 glDisable(GL_LIGHTING
);
82 glUseProgram_func(Program
);
84 /* vertex positions (deltas) depend on texture size and window size */
86 glUniform2f_func(uScale
,
87 2.0 * TEX_WIDTH
/ WinWidth
,
88 2.0 * TEX_HEIGHT
/ WinHeight
);
92 glBindTexture(GL_TEXTURE_2D
, Textures
[0]);
94 glTexCoord2f(0, 0); glVertex3fv(px
);
95 glTexCoord2f(1, 0); glVertex3fv(px
);
96 glTexCoord2f(1, 1); glVertex3fv(px
);
97 glTexCoord2f(0, 1); glVertex3fv(px
);
101 glBindTexture(GL_TEXTURE_2D
, Textures
[1]);
103 glTexCoord2f(0, 0); glVertex3fv(nx
);
104 glTexCoord2f(1, 0); glVertex3fv(nx
);
105 glTexCoord2f(1, 1); glVertex3fv(nx
);
106 glTexCoord2f(0, 1); glVertex3fv(nx
);
109 glUseProgram_func(0);
121 Yrot
= glutGet(GLUT_ELAPSED_TIME
) * 0.01;
127 Reshape(int width
, int height
)
131 glViewport(0, 0, width
, height
);
132 glMatrixMode(GL_PROJECTION
);
134 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
135 glMatrixMode(GL_MODELVIEW
);
137 glTranslatef(0.0f
, 0.0f
, -10.0f
);
142 Key(unsigned char key
, int x
, int y
)
159 printf("Using glBitmap\n");
161 printf("Using billboard texture\n");
164 glDeleteShader_func(FragShader
);
165 glDeleteShader_func(VertShader
);
166 glDeleteProgram_func(Program
);
167 glutDestroyWindow(Win
);
175 SpecialKey(int key
, int x
, int y
)
177 const GLfloat step
= 0.125f
;
192 /*printf("Xrot: %f Yrot: %f\n", Xrot, Yrot);*/
198 MakeTexImage(const char *p
, GLuint texobj
)
200 GLubyte image
[TEX_HEIGHT
][TEX_WIDTH
];
203 for (i
= 0; i
< TEX_HEIGHT
; i
++) {
204 for (j
= 0; j
< TEX_WIDTH
; j
++) {
205 k
= i
* TEX_WIDTH
+ j
;
215 glBindTexture(GL_TEXTURE_2D
, texobj
);
216 glTexImage2D(GL_TEXTURE_2D
, 0, GL_INTENSITY
, TEX_WIDTH
, TEX_HEIGHT
, 0,
217 GL_RED
, GL_UNSIGNED_BYTE
, image
);
218 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAX_LEVEL
, 1);
219 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
220 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
225 MakeBitmapTextures(void)
245 glGenTextures(2, Textures
);
246 MakeTexImage(px
, Textures
[0]);
247 MakeTexImage(nx
, Textures
[1]);
254 /* Fragment shader: modulate raster color by texture, discard fragments
257 static const char *fragShaderText
=
258 "uniform sampler2D tex2d; \n"
260 " vec4 c = texture2D(tex2d, gl_TexCoord[0].xy); \n"
263 " gl_FragColor = c * gl_Color; \n"
265 /* Vertex shader: compute new vertex position based on incoming vertex pos,
266 * texcoords and special scale factor.
268 static const char *vertShaderText
=
269 "uniform vec2 scale; \n"
271 " vec4 p = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
272 " gl_Position.xy = p.xy + gl_MultiTexCoord0.xy * scale * p.w; \n"
273 " gl_Position.zw = p.zw; \n"
274 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
275 " gl_FrontColor = gl_Color; \n"
278 if (!ShadersSupported())
283 VertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
284 FragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
285 Program
= LinkShaders(VertShader
, FragShader
);
287 glUseProgram_func(Program
);
289 uScale
= glGetUniformLocation_func(Program
, "scale");
290 uTex
= glGetUniformLocation_func(Program
, "tex2d");
292 glUniform1i_func(uTex
, 0); /* tex unit 0 */
295 glUseProgram_func(0);
297 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
298 glEnable(GL_DEPTH_TEST
);
299 glEnable(GL_NORMALIZE
);
302 MakeBitmapTextures();
307 main(int argc
, char *argv
[])
309 glutInit(&argc
, argv
);
310 glutInitWindowSize(WinWidth
, WinHeight
);
311 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
312 Win
= glutCreateWindow(argv
[0]);
314 glutReshapeFunc(Reshape
);
315 glutKeyboardFunc(Key
);
316 glutSpecialFunc(SpecialKey
);
317 glutDisplayFunc(Redisplay
);