22static 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"
114static PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
115static PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
116static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
117static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
118static PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
119static PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
120static PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
121static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
122static PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
123static PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
124static PFNGLUNIFORM1IARBPROC glUniform1iARB;
125static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
132 glCompileShaderARB(
shader);
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);
188 glUseProgramObjectARB(0);
193static 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])) {
256static void QuitShaders()
267power_of_two(
int input)
297 0x0000FF00, 0x00FF0000, 0xFF000000
300 0x00FF0000, 0x0000FF00, 0x000000FF
335void 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);
416int main(
int argc,
char **argv)
459 SDL_Log(
"Shaders supported, press SPACE to cycle them.\n");
475 current_shader = (current_shader + 1) %
NUM_SHADERS;
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
#define SDL_GL_SwapWindow
#define SDL_GetSurfaceBlendMode
#define SDL_SetSurfaceBlendMode
#define SDL_LogSetPriority
#define SDL_CreateRGBSurface
#define SDL_GL_GetProcAddress
#define SDL_GL_CreateContext
#define SDL_GL_ExtensionSupported
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
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
@ SDL_LOG_CATEGORY_APPLICATION
GLAPI void GLAPIENTRY glClearDepth(GLclampd depth)
GLAPI void GLAPIENTRY glTranslatef(GLfloat x, GLfloat y, GLfloat z)
GLAPI void GLAPIENTRY glTexCoord2f(GLfloat s, GLfloat t)
#define GL_TEXTURE_MIN_FILTER
GLAPI void GLAPIENTRY glDepthFunc(GLenum func)
GLAPI void GLAPIENTRY glEnable(GLenum cap)
GLAPI void GLAPIENTRY glLoadIdentity(void)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLAPI void GLAPIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor)
GLAPI void GLAPIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
GLAPI void GLAPIENTRY glBindTexture(GLenum target, GLuint texture)
#define GL_COLOR_BUFFER_BIT
#define GL_TEXTURE_ENV_MODE
GLAPI GLenum GLAPIENTRY glGetError(void)
GLAPI void GLAPIENTRY glBegin(GLenum mode)
GLAPI void GLAPIENTRY glGenTextures(GLsizei n, GLuint *textures)
GLAPI void GLAPIENTRY glVertex3f(GLfloat x, GLfloat y, GLfloat z)
#define GL_ONE_MINUS_SRC_ALPHA
GLAPI void GLAPIENTRY glEnd(void)
GLAPI void GLAPIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param)
#define GL_TEXTURE_MAG_FILTER
GLAPI void GLAPIENTRY glColor3f(GLfloat red, GLfloat green, GLfloat blue)
GLAPI void GLAPIENTRY glDisable(GLenum cap)
GLAPI void GLAPIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param)
#define GL_DEPTH_BUFFER_BIT
GLAPI void GLAPIENTRY glMatrixMode(GLenum mode)
GLAPI void GLAPIENTRY glShadeModel(GLenum mode)
GLAPI void GLAPIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
GLAPI void GLAPIENTRY glClear(GLbitfield mask)
#define GL_OBJECT_INFO_LOG_LENGTH_ARB
#define GL_FRAGMENT_SHADER_ARB
#define GL_OBJECT_COMPILE_STATUS_ARB
GLsizei GLsizei GLchar * source
#define GL_VERTEX_SHADER_ARB
GLsizei GLsizei GLuint * shaders
GLenum GLenum GLuint texture
GLuint GLsizei GLsizei * length
GLsizei const GLfloat * value
GLenum GLenum GLenum input
GLbitfield GLuint program
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
#define SDL_arraysize(array)
#define SDL_stack_alloc(type, count)
#define SDL_stack_free(data)
#define SDL_LoadBMP(file)
#define SDL_WINDOWPOS_CENTERED
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)
EGLSurface EGLNativeWindowType * window
A rectangle, with the origin at the upper left (integer).
A collection of pixels used in software blitting.
The type used to identify a window.
int main(int argc, char *argv[])