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;
GLAPI void GLAPIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
GLAPI void GLAPIENTRY glShadeModel(GLenum mode)
#define SDL_GL_ExtensionSupported
#define SDL_WINDOWPOS_CENTERED
#define SDL_GL_CreateContext
GLAPI void GLAPIENTRY glVertex3f(GLfloat x, GLfloat y, GLfloat z)
#define SDL_LoadBMP(file)
GLAPI void GLAPIENTRY glDisable(GLenum cap)
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
GLAPI void GLAPIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
GLfloat GLfloat GLfloat GLfloat h
A collection of pixels used in software blitting.
#define GL_DEPTH_BUFFER_BIT
GLAPI void GLAPIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define GL_TEXTURE_MAG_FILTER
#define GL_VERTEX_SHADER_ARB
GLsizei GLsizei GLuint * shaders
#define GL_ONE_MINUS_SRC_ALPHA
GLAPI void GLAPIENTRY glEnable(GLenum cap)
GLAPI void GLAPIENTRY glTexCoord2f(GLfloat s, GLfloat t)
#define SDL_GetSurfaceBlendMode
GLAPI void GLAPIENTRY glBindTexture(GLenum target, GLuint texture)
GLenum GLenum GLuint texture
GLenum GLenum GLenum input
GLAPI void GLAPIENTRY glDepthFunc(GLenum func)
#define SDL_stack_alloc(type, count)
#define SDL_GL_GetProcAddress
#define GL_OBJECT_INFO_LOG_LENGTH_ARB
GLAPI void GLAPIENTRY glGenTextures(GLsizei n, GLuint *textures)
#define GL_OBJECT_COMPILE_STATUS_ARB
GLubyte GLubyte GLubyte GLubyte w
GLsizei const GLfloat * value
GLAPI void GLAPIENTRY glClear(GLbitfield mask)
GLsizei GLsizei GLchar * source
GLAPI void GLAPIENTRY glTranslatef(GLfloat x, GLfloat y, GLfloat z)
#define GL_COLOR_BUFFER_BIT
#define GL_FRAGMENT_SHADER_ARB
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
GLAPI void GLAPIENTRY glBegin(GLenum mode)
GLAPI void GLAPIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param)
#define SDL_LogSetPriority
int main(int argc, char *argv[])
GLAPI void GLAPIENTRY glLoadIdentity(void)
#define SDL_CreateRGBSurface
EGLSurface EGLNativeWindowType * window
GLAPI void GLAPIENTRY glMatrixMode(GLenum mode)
GLAPI void GLAPIENTRY glClearDepth(GLclampd depth)
#define SDL_SetSurfaceBlendMode
The type used to identify a window.
#define GL_TEXTURE_ENV_MODE
GLAPI GLenum GLAPIENTRY glGetError(void)
#define SDL_arraysize(array)
GLbitfield GLuint program
GLAPI void GLAPIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
GLAPI void GLAPIENTRY glColor3f(GLfloat red, GLfloat green, GLfloat blue)
#define SDL_stack_free(data)
GLuint GLsizei GLsizei * length
#define GL_TEXTURE_MIN_FILTER
GLAPI void GLAPIENTRY glEnd(void)
#define SDL_GL_SwapWindow
A rectangle, with the origin at the upper left.
const GLubyte GLuint GLuint GLuint GLuint alpha GLboolean GLboolean GLboolean GLboolean alpha GLint GLint GLsizei GLsizei GLenum type GLenum GLint GLenum GLint GLint GLsizei GLsizei GLint border GLenum GLint GLint GLint GLint GLint GLsizei GLsizei height GLsizei GLsizei GLenum GLenum const GLvoid *pixels GLenum GLint GLint GLint GLint j2 GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble zFar GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLfloat *params GLenum GLint GLenum GLenum GLvoid *pixels GLenum GLint GLenum GLint *params GLenum GLenum GLint *params GLenum GLsizei const GLvoid *pointer GLenum GLenum const GLint *params GLenum GLfloat GLfloat GLint GLint const GLfloat *points GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat *points GLint GLfloat GLfloat GLint GLfloat GLfloat v2 GLenum GLenum const GLint *params GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble zFar GLenum GLsizei const GLuint *values GLsizei const GLuint const GLclampf *priorities GLfloat GLfloat GLfloat GLfloat w GLint GLint GLsizei GLsizei GLenum GLenum GLvoid *pixels GLfloat GLfloat GLfloat GLfloat y2 GLdouble GLdouble GLdouble GLdouble z GLdouble GLdouble GLdouble GLdouble q GLshort GLshort GLshort GLshort q GLenum GLenum const GLfloat *params GLenum GLenum const GLdouble *params GLenum GLenum const GLint *params glTexImage2D
const GLubyte GLuint GLuint GLuint GLuint alpha GLboolean GLboolean GLboolean GLboolean alpha GLint GLint GLsizei GLsizei GLenum type GLenum GLint GLenum GLint GLint GLsizei GLsizei GLint border GLenum GLint GLint GLint GLint GLint GLsizei GLsizei height GLsizei GLsizei GLenum GLenum const GLvoid *pixels GLenum GLint GLint GLint GLint j2 GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble zFar GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLfloat *params GLenum GLint GLenum GLenum GLvoid *pixels GLenum GLint GLenum GLint *params GLenum GLenum GLint *params GLenum GLsizei const GLvoid *pointer GLenum GLenum const GLint *params GLenum GLfloat GLfloat GLint GLint const GLfloat *points GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat *points GLint GLfloat GLfloat GLint GLfloat GLfloat v2 GLenum GLenum const GLint *params glOrtho