4b62686cbff2afb0992174713c797b6fceb07490
2 * Implement glRasterPos + glBitmap with textures + shaders.
18 static GLuint FragShader
;
19 static GLuint VertShader
;
20 static GLuint Program
;
23 static GLint WinWidth
= 500, WinHeight
= 500;
24 static GLboolean Anim
= GL_TRUE
;
25 static GLboolean Bitmap
= GL_FALSE
;
26 static GLfloat Xrot
= 20.0f
, Yrot
= 70.0f
;
27 static GLint uTex
, uScale
;
28 static GLuint Textures
[2];
35 BitmapText(const char *s
)
38 glutBitmapCharacter(GLUT_BITMAP_8_BY_13
, (int) *s
);
47 static const GLfloat px
[3] = { 1.2, 0, 0};
48 static const GLfloat nx
[3] = {-1.2, 0, 0};
50 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
53 glRotatef(Xrot
, 1.0f
, 0.0f
, 0.0f
);
54 glRotatef(Yrot
, 0.0f
, 1.0f
, 0.0f
);
56 glEnable(GL_LIGHTING
);
59 glScalef(0.5, 0.5, 0.5);
60 glutSolidDodecahedron();
63 glDisable(GL_LIGHTING
);
80 glUseProgram_func(Program
);
82 /* vertex positions (deltas) depend on texture size and window size */
84 glUniform2f_func(uScale
,
85 2.0 * TEX_WIDTH
/ WinWidth
,
86 2.0 * TEX_HEIGHT
/ WinHeight
);
90 glBindTexture(GL_TEXTURE_2D
, Textures
[0]);
92 glTexCoord2f(0, 0); glVertex3fv(px
);
93 glTexCoord2f(1, 0); glVertex3fv(px
);
94 glTexCoord2f(1, 1); glVertex3fv(px
);
95 glTexCoord2f(0, 1); glVertex3fv(px
);
99 glBindTexture(GL_TEXTURE_2D
, Textures
[1]);
101 glTexCoord2f(0, 0); glVertex3fv(nx
);
102 glTexCoord2f(1, 0); glVertex3fv(nx
);
103 glTexCoord2f(1, 1); glVertex3fv(nx
);
104 glTexCoord2f(0, 1); glVertex3fv(nx
);
107 glUseProgram_func(0);
119 Yrot
= glutGet(GLUT_ELAPSED_TIME
) * 0.01;
125 Reshape(int width
, int height
)
129 glViewport(0, 0, width
, height
);
130 glMatrixMode(GL_PROJECTION
);
132 glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
133 glMatrixMode(GL_MODELVIEW
);
135 glTranslatef(0.0f
, 0.0f
, -10.0f
);
140 Key(unsigned char key
, int x
, int y
)
157 printf("Using glBitmap\n");
159 printf("Using billboard texture\n");
162 glDeleteShader_func(FragShader
);
163 glDeleteShader_func(VertShader
);
164 glDeleteProgram_func(Program
);
165 glutDestroyWindow(Win
);
173 SpecialKey(int key
, int x
, int y
)
175 const GLfloat step
= 0.125f
;
190 /*printf("Xrot: %f Yrot: %f\n", Xrot, Yrot);*/
196 MakeTexImage(const char *p
, GLuint texobj
)
198 GLubyte image
[TEX_HEIGHT
][TEX_WIDTH
];
201 for (i
= 0; i
< TEX_HEIGHT
; i
++) {
202 for (j
= 0; j
< TEX_WIDTH
; j
++) {
203 k
= i
* TEX_WIDTH
+ j
;
213 glBindTexture(GL_TEXTURE_2D
, texobj
);
214 glTexImage2D(GL_TEXTURE_2D
, 0, GL_INTENSITY
, TEX_WIDTH
, TEX_HEIGHT
, 0,
215 GL_RED
, GL_UNSIGNED_BYTE
, image
);
216 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAX_LEVEL
, 1);
217 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
218 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
223 MakeBitmapTextures(void)
243 glGenTextures(2, Textures
);
244 MakeTexImage(px
, Textures
[0]);
245 MakeTexImage(nx
, Textures
[1]);
250 LoadAndCompileShader(GLuint shader
, const char *text
)
254 glShaderSource_func(shader
, 1, (const GLchar
**) &text
, NULL
);
256 glCompileShader_func(shader
);
258 glGetShaderiv_func(shader
, GL_COMPILE_STATUS
, &stat
);
262 glGetShaderInfoLog_func(shader
, 1000, &len
, log
);
263 fprintf(stderr
, "fslight: problem compiling shader:\n%s\n", log
);
270 CheckLink(GLuint prog
)
273 glGetProgramiv_func(prog
, GL_LINK_STATUS
, &stat
);
277 glGetProgramInfoLog_func(prog
, 1000, &len
, log
);
278 fprintf(stderr
, "Linker error:\n%s\n", log
);
286 /* Fragment shader: modulate raster color by texture, discard fragments
289 static const char *fragShaderText
=
290 "uniform sampler2D tex2d; \n"
292 " vec4 c = texture2D(tex2d, gl_TexCoord[0].xy); \n"
295 " gl_FragColor = c * gl_Color; \n"
297 /* Vertex shader: compute new vertex position based on incoming vertex pos,
298 * texcoords and special scale factor.
300 static const char *vertShaderText
=
301 "uniform vec2 scale; \n"
303 " vec4 p = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
304 " gl_Position.xy = p.xy + gl_MultiTexCoord0.xy * scale * p.w; \n"
305 " gl_Position.zw = p.zw; \n"
306 " gl_TexCoord[0] = gl_MultiTexCoord0; \n"
307 " gl_FrontColor = gl_Color; \n"
311 version
= (const char *) glGetString(GL_VERSION
);
312 if (version
[0] != '2' || version
[1] != '.') {
313 printf("This program requires OpenGL 2.x, found %s\n", version
);
316 printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER
));
320 FragShader
= glCreateShader_func(GL_FRAGMENT_SHADER
);
321 LoadAndCompileShader(FragShader
, fragShaderText
);
323 VertShader
= glCreateShader_func(GL_VERTEX_SHADER
);
324 LoadAndCompileShader(VertShader
, vertShaderText
);
326 Program
= glCreateProgram_func();
327 glAttachShader_func(Program
, FragShader
);
328 glAttachShader_func(Program
, VertShader
);
329 glLinkProgram_func(Program
);
331 glUseProgram_func(Program
);
333 uScale
= glGetUniformLocation_func(Program
, "scale");
334 uTex
= glGetUniformLocation_func(Program
, "tex2d");
336 glUniform1i_func(uTex
, 0); /* tex unit 0 */
339 glUseProgram_func(0);
341 glClearColor(0.3f
, 0.3f
, 0.3f
, 0.0f
);
342 glEnable(GL_DEPTH_TEST
);
343 glEnable(GL_NORMALIZE
);
346 MakeBitmapTextures();
351 main(int argc
, char *argv
[])
353 glutInit(&argc
, argv
);
354 glutInitWindowSize(WinWidth
, WinHeight
);
355 glutInitDisplayMode(GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
356 Win
= glutCreateWindow(argv
[0]);
357 glutReshapeFunc(Reshape
);
358 glutKeyboardFunc(Key
);
359 glutSpecialFunc(SpecialKey
);
360 glutDisplayFunc(Redisplay
);