2 * Implement glRasterPos + glBitmap with textures + shaders.
14 #include "shaderutil.h"
17 static GLuint FragShader
;
18 static GLuint VertShader
;
19 static GLuint Program
;
22 static GLint WinWidth
= 500, WinHeight
= 500;
23 static GLboolean Anim
= GL_TRUE
;
24 static GLboolean Bitmap
= GL_FALSE
;
25 static GLfloat Xrot
= 20.0f
, Yrot
= 70.0f
;
26 static GLint uTex
, uScale
;
27 static GLuint Textures
[2];
34 BitmapText(const char *s
)
37 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
46 static const GLfloat px
[3] = { 1.2, 0, 0};
47 static const GLfloat nx
[3] = {-1.2, 0, 0};
49 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
52 glRotatef(Xrot
, 1.0f
, 0.0f
, 0.0f
);
53 glRotatef(Yrot
, 0.0f
, 1.0f
, 0.0f
);
55 glEnable(GL_LIGHTING
);
58 glScalef(0.5, 0.5, 0.5);
59 glutSolidDodecahedron();
62 glDisable(GL_LIGHTING
);
79 glUseProgram(Program
);
81 /* vertex positions (deltas) depend on texture size and window size */
84 2.0 * TEX_WIDTH
/ WinWidth
,
85 2.0 * TEX_HEIGHT
/ WinHeight
);
89 glBindTexture(GL_TEXTURE_2D
, Textures
[0]);
91 glTexCoord2f(0, 0); glVertex3fv(px
);
92 glTexCoord2f(1, 0); glVertex3fv(px
);
93 glTexCoord2f(1, 1); glVertex3fv(px
);
94 glTexCoord2f(0, 1); glVertex3fv(px
);
98 glBindTexture(GL_TEXTURE_2D
, Textures
[1]);
100 glTexCoord2f(0, 0); glVertex3fv(nx
);
101 glTexCoord2f(1, 0); glVertex3fv(nx
);
102 glTexCoord2f(1, 1); glVertex3fv(nx
);
103 glTexCoord2f(0, 1); glVertex3fv(nx
);
118 Yrot
= glutGet(GLUT_ELAPSED_TIME
) * 0.01;
124 Reshape(int width
, int height
)
128 glViewport(0, 0, width
, height
);
129 glMatrixMode(GL_PROJECTION
);
131 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
132 glMatrixMode(GL_MODELVIEW
);
134 glTranslatef(0.0f
, 0.0f
, -10.0f
);
139 Key(unsigned char key
, int x
, int y
)
156 printf("Using glBitmap\n");
158 printf("Using billboard texture\n");
161 glDeleteShader(FragShader
);
162 glDeleteShader(VertShader
);
163 glDeleteProgram(Program
);
164 glutDestroyWindow(Win
);
172 SpecialKey(int key
, int x
, int y
)
174 const GLfloat step
= 0.125f
;
189 /*printf("Xrot: %f Yrot: %f\n", Xrot, Yrot);*/
195 MakeTexImage(const char *p
, GLuint texobj
)
197 GLubyte image
[TEX_HEIGHT
][TEX_WIDTH
];
200 for (i
= 0; i
< TEX_HEIGHT
; i
++) {
201 for (j
= 0; j
< TEX_WIDTH
; j
++) {
202 k
= i
* TEX_WIDTH
+ j
;
212 glBindTexture(GL_TEXTURE_2D
, texobj
);
213 glTexImage2D(GL_TEXTURE_2D
, 0, GL_INTENSITY
, TEX_WIDTH
, TEX_HEIGHT
, 0,
214 GL_RED
, GL_UNSIGNED_BYTE
, image
);
215 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAX_LEVEL
, 1);
216 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
217 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
222 MakeBitmapTextures(void)
242 glGenTextures(2, Textures
);
243 MakeTexImage(px
, Textures
[0]);
244 MakeTexImage(nx
, Textures
[1]);
251 /* Fragment shader: modulate raster color by texture, discard fragments
254 static const char *fragShaderText
=
255 "uniform sampler2D tex2d; \n"
257 " vec4 c = texture2D(tex2d, gl_TexCoord[0].xy); \n"
260 " gl_FragColor = c * gl_Color; \n"
262 /* Vertex shader: compute new vertex position based on incoming vertex pos,
263 * texcoords and special scale factor.
265 static const char *vertShaderText
=
266 "uniform vec2 scale; \n"
268 " vec4 p = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
269 " gl_Position.xy = p.xy + gl_MultiTexCoord0.xy * scale * p.w; \n"
270 " gl_Position.zw = p.zw; \n"
271 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
272 " gl_FrontColor = gl_Color; \n"
275 if (!ShadersSupported())
278 VertShader
= CompileShaderText(GL_VERTEX_SHADER
, vertShaderText
);
279 FragShader
= CompileShaderText(GL_FRAGMENT_SHADER
, fragShaderText
);
280 Program
= LinkShaders(VertShader
, FragShader
);
282 glUseProgram(Program
);
284 uScale
= glGetUniformLocation(Program
, "scale");
285 uTex
= glGetUniformLocation(Program
, "tex2d");
287 glUniform1i(uTex
, 0); /* tex unit 0 */
292 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
293 glEnable(GL_DEPTH_TEST
);
294 glEnable(GL_NORMALIZE
);
297 MakeBitmapTextures();
302 main(int argc
, char *argv
[])
304 glutInit(&argc
, argv
);
305 glutInitWindowSize(WinWidth
, WinHeight
);
306 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
307 Win
= glutCreateWindow(argv
[0]);
309 glutReshapeFunc(Reshape
);
310 glutKeyboardFunc(Key
);
311 glutSpecialFunc(SpecialKey
);
312 glutDisplayFunc(Redisplay
);