| 42 | #include <assert.h> |
| 43 | |
| 44 | void shaders() { |
| 45 | #if USE_GLEW |
| 46 | glewInit(); |
| 47 | #endif |
| 48 | |
| 49 | GLint ok; |
| 50 | |
| 51 | const char *vertexShader = "void main(void) \n" |
| 52 | "{ \n" |
| 53 | " gl_Position = ftransform(); \n" |
| 54 | " gl_TexCoord[0] = gl_MultiTexCoord0; \n" |
| 55 | " gl_FrontColor = gl_Color; \n" |
| 56 | "} \n"; |
| 57 | const char *fragmentShader = "uniform sampler2D tex0; \n" |
| 58 | "void main(void) \n" |
| 59 | "{ \n" |
| 60 | " gl_FragColor = gl_Color * texture2D(tex0, gl_TexCoord[0].xy); \n" |
| 61 | "} \n"; |
| 62 | |
| 63 | GLuint vs = glCreateShader(GL_VERTEX_SHADER); |
| 64 | glShaderSource(vs, 1, &vertexShader, NULL); |
| 65 | glCompileShader(vs); |
| 66 | glGetShaderiv(vs, GL_COMPILE_STATUS, &ok); |
| 67 | assert(ok); |
| 68 | |
| 69 | GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); |
| 70 | glShaderSource(fs, 1, &fragmentShader, NULL); |
| 71 | glCompileShader(fs); |
| 72 | glGetShaderiv(fs, GL_COMPILE_STATUS, &ok); |
| 73 | assert(ok); |
| 74 | |
| 75 | GLuint program = glCreateProgram(); |
| 76 | |
| 77 | glAttachShader(program, vs); |
| 78 | glAttachShader(program, fs); |
| 79 | glLinkProgram(program); |
| 80 | glGetProgramiv(program, GL_LINK_STATUS, &ok); |
| 81 | assert(ok); |
| 82 | |
| 83 | glUseProgram(program); |
| 84 | |
| 85 | { |
| 86 | // Also, check getting the error log |
| 87 | const char *fakeVertexShader = "atbute ve4 blarg; ### AAA\n"; |
| 88 | GLuint vs = glCreateShader(GL_VERTEX_SHADER); |
| 89 | glShaderSource(vs, 1, &fakeVertexShader, NULL); |
| 90 | glCompileShader(vs); |
| 91 | glGetShaderiv(vs, GL_COMPILE_STATUS, &ok); |
| 92 | assert(!ok); |
| 93 | GLint infoLen = 0; |
| 94 | glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &infoLen); |
| 95 | assert(infoLen > 1); |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | int main(int argc, char *argv[]) |
| 100 | { |