/** * Test very basic glsl functionality (identity vertex and fragment shaders). * Brian Paul & Stephane Marchesin */ #include <assert.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <GL/glew.h> #include <GL/glut.h> #include "shaderutil.h" static char *FragProgFile = NULL; static char *VertProgFile = NULL; static GLuint fragShader; static GLuint vertShader; static GLuint program; static GLint win = 0; static GLboolean anim = GL_FALSE; static GLfloat xRot = 0.0f, yRot = 0.0f; static int w,h; static void Redisplay(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(.8,0,0); glVertex3f(-0.9, -0.9, 0.0); glColor3f(0,.9,0); glVertex3f( 0.9, -0.9, 0.0); glColor3f(0,0,.7); glVertex3f( 0.0, 0.9, 0.0); glEnd(); glutSwapBuffers(); } static void Idle(void) { yRot = glutGet(GLUT_ELAPSED_TIME) * 0.1; glutPostRedisplay(); } static void Reshape(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); w = width; h = height; } static void CleanUp(void) { glDeleteShader(fragShader); glDeleteShader(vertShader); glDeleteProgram(program); glutDestroyWindow(win); } static void Key(unsigned char key, int x, int y) { (void) x; (void) y; switch(key) { case ' ': case 'a': anim = !anim; if (anim) glutIdleFunc(Idle); else glutIdleFunc(NULL); break; case 27: CleanUp(); exit(0); break; } glutPostRedisplay(); } static void SpecialKey(int key, int x, int y) { const GLfloat step = 3.0f; (void) x; (void) y; switch(key) { case GLUT_KEY_UP: xRot -= step; break; case GLUT_KEY_DOWN: xRot += step; break; case GLUT_KEY_LEFT: yRot -= step; break; case GLUT_KEY_RIGHT: yRot += step; break; } glutPostRedisplay(); } static void Init(void) { static const char *fragShaderText = "void main() {\n" " gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n" "}\n"; static const char *vertShaderText = "void main() {\n" " gl_Position = gl_Vertex;\n" "}\n"; if (!ShadersSupported()) exit(1); if (FragProgFile) fragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile); else fragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText); if (VertProgFile) vertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile); else vertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText); program = LinkShaders(vertShader, fragShader); glUseProgram(program); /*assert(glGetError() == 0);*/ glClearColor(0.3f, 0.3f, 0.3f, 0.0f); glEnable(GL_DEPTH_TEST); printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); assert(glIsProgram(program)); assert(glIsShader(fragShader)); assert(glIsShader(vertShader)); glColor3f(1, 0, 0); } static void ParseOptions(int argc, char *argv[]) { int i; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-fs") == 0) { FragProgFile = argv[i+1]; } else if (strcmp(argv[i], "-vs") == 0) { VertProgFile = argv[i+1]; } } } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitWindowSize(200, 200); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); win = glutCreateWindow(argv[0]); glewInit(); glutReshapeFunc(Reshape); glutKeyboardFunc(Key); glutSpecialFunc(SpecialKey); glutDisplayFunc(Redisplay); if (anim) glutIdleFunc(Idle); ParseOptions(argc, argv); Init(); glutMainLoop(); return 0; }