/* Copyright (C) 2010 Nick Bowler * * License WTFPL2: Do What The Fuck You Want To Public License, version 2. * This is free software: you are free to do what the fuck you want to. * There is NO WARRANTY, to the extent permitted by law. * * In case the above is not acceptable, you may alternately choose the terms * of the MIT license: http://opensource.org/licenses/mit-license.php. */ #include #include #include #include unsigned create_shader(int type, const char *text) { GLuint shader; GLint status; shader = glCreateShader(type); if (!shader) return 0; glShaderSource(shader, 1, &text, NULL); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if (!status) { GLint size; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &size); char log[size]; glGetShaderInfoLog(shader, size, NULL, log); fprintf(stderr, "failed to compile shader:\n%s", log); glDeleteShader(shader); return 0; } return shader; } unsigned create_program(unsigned num, ...) { GLuint program; GLint status; va_list ap; program = glCreateProgram(); va_start(ap, num); for (unsigned i = 0; i < num; i++) { glAttachShader(program, va_arg(ap, unsigned)); } va_end(ap); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &status); if (!status) { GLint size; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &size); char log[size]; glGetShaderInfoLog(program, size, NULL, log); fprintf(stderr, "failed to link shader:\n%s", log); glDeleteProgram(program); return 0; } return program; } int main(int argc, char **argv) { const char *glsl_vertex, *glsl_fragment; int vertex, fragment; GLenum err; int window; glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); window = glutCreateWindow("listconfuse"); if (window == 0) return EXIT_FAILURE; glutSetWindow(window); err = glewInit(); if (err != GLEW_OK) { fprintf(stderr, "glewInit: %s\n", glewGetErrorString(err)); return EXIT_FAILURE; } glsl_vertex = "varying float v;" "void main(void)" "{" " gl_Position = ftransform();" " v = 0.0;" "}"; vertex = create_shader(GL_VERTEX_SHADER, glsl_vertex); create_program(1, vertex); return EXIT_SUCCESS; }