22 static int current_shader = 0;
35 const char *vert_source;
36 const char *frag_source;
44 "varying vec4 v_color;\n"
48 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
49 " v_color = gl_Color;\n"
52 "varying vec4 v_color;\n"
56 " gl_FragColor = v_color;\n"
63 "varying vec4 v_color;\n"
64 "varying vec2 v_texCoord;\n"
68 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
69 " v_color = gl_Color;\n"
70 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
73 "varying vec4 v_color;\n"
74 "varying vec2 v_texCoord;\n"
75 "uniform sampler2D tex0;\n"
79 " gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
86 "varying vec2 v_texCoord;\n"
90 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
91 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
94 "varying vec2 v_texCoord;\n"
102 " delta = vec2(0.5, 0.5) - v_texCoord;\n"
103 " dist = dot(delta, delta);\n"
105 " color.r = v_texCoord.x;\n"
106 " color.g = v_texCoord.x * v_texCoord.y;\n"
107 " color.b = v_texCoord.y;\n"
108 " color.a = 1.0 - (dist * 4.0);\n"
109 " gl_FragColor = color;\n"
114 static PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
115 static PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
116 static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
117 static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
118 static PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
119 static PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
120 static PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
121 static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
122 static PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
123 static PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
124 static PFNGLUNIFORM1IARBPROC glUniform1iARB;
125 static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
131 glShaderSourceARB(shader, 1, &source,
NULL);
132 glCompileShaderARB(shader);
140 glGetInfoLogARB(shader, length,
NULL, info);
152 const int num_tmus_bound = 4;
159 data->program = glCreateProgramObjectARB();
163 if (!CompileShader(data->vert_shader, data->vert_source)) {
169 if (!CompileShader(data->frag_shader, data->frag_source)) {
174 glAttachObjectARB(data->program, data->vert_shader);
175 glAttachObjectARB(data->program, data->frag_shader);
176 glLinkProgramARB(data->program);
179 glUseProgramObjectARB(data->program);
180 for (i = 0; i < num_tmus_bound; ++
i) {
183 location = glGetUniformLocationARB(data->program, tex_name);
185 glUniform1iARB(location, i);
188 glUseProgramObjectARB(0);
193 static void DestroyShaderProgram(ShaderData *data)
195 if (shaders_supported) {
196 glDeleteObjectARB(data->vert_shader);
197 glDeleteObjectARB(data->frag_shader);
198 glDeleteObjectARB(data->program);
214 glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateProgramObjectARB");
215 glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateShaderObjectARB");
218 glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
SDL_GL_GetProcAddress(
"glGetObjectParameterivARB");
219 glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
SDL_GL_GetProcAddress(
"glGetUniformLocationARB");
223 glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glUseProgramObjectARB");
224 if (glAttachObjectARB &&
225 glCompileShaderARB &&
226 glCreateProgramObjectARB &&
227 glCreateShaderObjectARB &&
230 glGetObjectParameterivARB &&
231 glGetUniformLocationARB &&
235 glUseProgramObjectARB) {
240 if (!shaders_supported) {
246 if (!CompileShaderProgram(&
shaders[i])) {
256 static void QuitShaders()
261 DestroyShaderProgram(&
shaders[i]);
267 power_of_two(
int input)
271 while (value < input) {
287 w = power_of_two(surface->
w);
288 h = power_of_two(surface->
h);
291 texcoord[2] = (
GLfloat) surface->
w / w;
297 0x0000FF00, 0x00FF0000, 0xFF000000
300 0x00FF0000, 0x0000FF00, 0x000000FF
335 void InitGL(
int Width,
int Height)
350 glOrtho(-3.0, 3.0, -3.0 / aspect, 3.0 / aspect, 0.0, 1.0);
392 if (shaders_supported) {
407 if (shaders_supported) {
408 glUseProgramObjectARB(0);
416 int main(
int argc,
char **argv)
453 texture = SDL_GL_LoadTexture(surface, texcoords);
459 SDL_Log(
"Shaders supported, press SPACE to cycle them.\n");
465 DrawGLScene(window, texture, texcoords);
475 current_shader = (current_shader + 1) % NUM_SHADERS;