2 * Utilities for OpenGL shading language
14 #include "shaderutil.h"
20 static GLboolean firstCall
= GL_TRUE
;
28 ShadersSupported(void)
30 const char *version
= (const char *) glGetString(GL_VERSION
);
31 if (version
[0] == '2' && version
[1] == '.') {
34 else if (glutExtensionSupported("GL_ARB_vertex_shader")
35 && glutExtensionSupported("GL_ARB_fragment_shader")
36 && glutExtensionSupported("GL_ARB_shader_objects")) {
37 fprintf(stderr
, "Warning: Trying ARB GLSL instead of OpenGL 2.x. This may not work.\n");
45 CompileShaderText(GLenum shaderType
, const char *text
)
52 shader
= glCreateShader(shaderType
);
53 glShaderSource(shader
, 1, (const GLchar
**) &text
, NULL
);
54 glCompileShader(shader
);
55 glGetShaderiv(shader
, GL_COMPILE_STATUS
, &stat
);
59 glGetShaderInfoLog(shader
, 1000, &len
, log
);
60 fprintf(stderr
, "Error: problem compiling shader: %s\n", log
);
64 /*printf("Shader compiled OK\n");*/
71 * Read a shader from a file.
74 CompileShaderFile(GLenum shaderType
, const char *filename
)
76 const int max
= 100*1000;
78 char *buffer
= (char*) malloc(max
);
85 f
= fopen(filename
, "r");
87 fprintf(stderr
, "Unable to open shader file %s\n", filename
);
91 n
= fread(buffer
, 1, max
, f
);
92 /*printf("read %d bytes from shader file %s\n", n, filename);*/
95 shader
= CompileShaderText(shaderType
, buffer
);
109 LinkShaders(GLuint vertShader
, GLuint fragShader
)
111 GLuint program
= glCreateProgram();
113 assert(vertShader
|| fragShader
);
116 glAttachShader(program
, fragShader
);
118 glAttachShader(program
, vertShader
);
119 glLinkProgram(program
);
124 glGetProgramiv(program
, GL_LINK_STATUS
, &stat
);
128 glGetProgramInfoLog(program
, 1000, &len
, log
);
129 fprintf(stderr
, "Shader link error:\n%s\n", log
);
139 InitUniforms(GLuint program
, struct uniform_info uniforms
[])
143 for (i
= 0; uniforms
[i
].name
; i
++) {
145 = glGetUniformLocation(program
, uniforms
[i
].name
);
147 printf("Uniform %s location: %d\n", uniforms
[i
].name
,
148 uniforms
[i
].location
);
150 switch (uniforms
[i
].size
) {
152 if (uniforms
[i
].type
== GL_INT
)
153 glUniform1i(uniforms
[i
].location
,
154 (GLint
) uniforms
[i
].value
[0]);
156 glUniform1fv(uniforms
[i
].location
, 1, uniforms
[i
].value
);
159 glUniform2fv(uniforms
[i
].location
, 1, uniforms
[i
].value
);
162 glUniform3fv(uniforms
[i
].location
, 1, uniforms
[i
].value
);
165 glUniform4fv(uniforms
[i
].location
, 1, uniforms
[i
].value
);