X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=progs%2Fdemos%2Fshapes%2Fshapes.c;h=732691489369d13d1b14483454ab4fc5b9f68591;hb=c6646dafd99f32c205f940b759ca59cf5db2e2a4;hp=c6527fc8f30d62bc540b0c66144b0b7d4d08ac29;hpb=8c9773ab36947fcaad5826eb9962d203d914c86d;p=freeglut diff --git a/progs/demos/shapes/shapes.c b/progs/demos/shapes/shapes.c index c6527fc..7326914 100644 --- a/progs/demos/shapes/shapes.c +++ b/progs/demos/shapes/shapes.c @@ -50,6 +50,15 @@ #include #endif +/* report GL errors, if any, to stderr */ +void checkError(const char *functionName) +{ + GLenum error; + while (( error = glGetError() ) != GL_NO_ERROR) { + fprintf (stderr, "GL error 0x%X detected in %s\n", error, functionName); + } +} + /* * OpenGL 2+ shader mode needs some function and macro definitions, * avoiding a dependency on additional libraries like GLEW or the @@ -144,9 +153,9 @@ const ourGLchar *vertexShaderSource[] = { " */", "attribute vec3 fg_coord;", "attribute vec3 fg_normal;", - "varying vec4 position; // position of the vertex (and fragment) in world space", - "varying vec3 varyingNormalDirection; // surface normal vector in world space", - "uniform mat4 m, p; // don't need v, as always identity in our demo", + "varying vec4 position; /* position of the vertex (and fragment) in world space */", + "varying vec3 varyingNormalDirection; /* surface normal vector in world space */", + "uniform mat4 m, p; /* don't need v, as always identity in our demo */", "uniform mat3 m_3x3_inv_transp;", " ", "void main()", @@ -155,7 +164,7 @@ const ourGLchar *vertexShaderSource[] = { " position = m * fg_coord4;", " varyingNormalDirection = normalize(m_3x3_inv_transp * fg_normal);", " ", - " mat4 mvp = p*m; // normally p*v*m", + " mat4 mvp = p*m; /* normally p*v*m */", " gl_Position = mvp * fg_coord4;", "}" }; @@ -166,9 +175,9 @@ const ourGLchar *fragmentShaderSource[] = { " * This file is in the public domain.", " * Contributors: Martin Kraus, Sylvain Beucler", " */", - "varying vec4 position; // position of the vertex (and fragment) in world space", - "varying vec3 varyingNormalDirection; // surface normal vector in world space", - "//uniform mat4 v_inv; // in this demo, the view matrix is always an identity matrix", + "varying vec4 position; /* position of the vertex (and fragment) in world space */", + "varying vec3 varyingNormalDirection; /* surface normal vector in world space */", + "/* uniform mat4 v_inv; // in this demo, the view matrix is always an identity matrix */", " ", "struct lightSource", "{", @@ -187,7 +196,7 @@ const ourGLchar *fragmentShaderSource[] = { " 180.0, 0.0,", " vec3(0.0, 0.0, 0.0)", ");", - "vec4 scene_ambient = vec4(1.0, 0.0, 0.0, 1.0);", + "vec4 scene_ambient = vec4(0.0, 0.0, 0.0, 1.0);", " ", "struct material", "{", @@ -197,8 +206,8 @@ const ourGLchar *fragmentShaderSource[] = { " float shininess;", "};", "material frontMaterial = material(", - " vec4(0.7, 0.7, 0.7, 1.0),", - " vec4(0.8, 0.8, 0.8, 1.0),", + " vec4(1.0, 0.0, 0.0, 1.0),", + " vec4(1.0, 0.0, 0.0, 1.0),", " vec4(1.0, 1.0, 1.0, 1.0),", " 100.0", ");", @@ -206,17 +215,17 @@ const ourGLchar *fragmentShaderSource[] = { "void main()", "{", " vec3 normalDirection = normalize(varyingNormalDirection);", - " //vec3 viewDirection = normalize(vec3(v_inv * vec4(0.0, 0.0, 0.0, 1.0) - position));", - " vec3 viewDirection = normalize(vec3(vec4(0.0, 0.0, 0.0, 1.0) - position)); // in this demo, the view matrix is always an identity matrix", + " /* vec3 viewDirection = normalize(vec3(v_inv * vec4(0.0, 0.0, 0.0, 1.0) - position)); */", + " vec3 viewDirection = normalize(vec3(vec4(0.0, 0.0, 0.0, 1.0) - position)); /* in this demo, the view matrix is always an identity matrix */", " vec3 lightDirection;", " float attenuation;", " ", - " if (0.0 == light0.position.w) // directional light?", + " if (0.0 == light0.position.w) /* directional light? */", " {", - " attenuation = 1.0; // no attenuation", + " attenuation = 1.0; /* no attenuation */", " lightDirection = normalize(vec3(light0.position));", " } ", - " else // point light or spotlight (or other kind of light) ", + " else /* point light or spotlight (or other kind of light) */", " {", " vec3 positionToLightSource = vec3(light0.position - position);", " float distance = length(positionToLightSource);", @@ -225,10 +234,10 @@ const ourGLchar *fragmentShaderSource[] = { " + light0.linearAttenuation * distance", " + light0.quadraticAttenuation * distance * distance);", " ", - " if (light0.spotCutoff <= 90.0) // spotlight?", + " if (light0.spotCutoff <= 90.0) /* spotlight? */", " {", " float clampedCosine = max(0.0, dot(-lightDirection, light0.spotDirection));", - " if (clampedCosine < cos(radians(light0.spotCutoff))) // outside of spotlight cone?", + " if (clampedCosine < cos(radians(light0.spotCutoff))) /* outside of spotlight cone? */", " {", " attenuation = 0.0;", " }", @@ -246,11 +255,11 @@ const ourGLchar *fragmentShaderSource[] = { " * max(0.0, dot(normalDirection, lightDirection));", " ", " vec3 specularReflection;", - " if (dot(normalDirection, lightDirection) < 0.0) // light source on the wrong side?", + " if (dot(normalDirection, lightDirection) < 0.0) /* light source on the wrong side? */", " {", - " specularReflection = vec3(0.0, 0.0, 0.0); // no specular reflection", + " specularReflection = vec3(0.0, 0.0, 0.0); /* no specular reflection */", " }", - " else // light source on the right side", + " else /* light source on the right side */", " {", " specularReflection = attenuation * vec3(light0.specular) * vec3(frontMaterial.specular) ", " * pow(max(0.0, dot(reflect(-lightDirection, normalDirection), viewDirection)), frontMaterial.shininess);", @@ -282,12 +291,13 @@ GLint getAttribOrUniformLocation(const char* name, GLuint program, GLboolean isA return uniform; } + checkError ("getAttribOrUniformLocation"); } GLuint program; GLint attribute_fg_coord = -1, attribute_fg_normal = -1; GLint uniform_m = -1, uniform_p = -1, uniform_m_3x3_inv_transp = -1; -GLint shaderReady = 0; // Set to 1 when all initialization went well, to -1 when somehow unusable. +GLint shaderReady = 0; /* Set to 1 when all initialization went well, to -1 when shader somehow unusable. */ @@ -305,12 +315,16 @@ void compileAndCheck(GLuint shader) fprintf (stderr, "compile log: %s\n", infoLog); free (infoLog); } + checkError ("compileAndCheck"); } GLuint compileShaderSource(GLenum type, GLsizei count, const ourGLchar **string) { GLuint shader = gl_CreateShader (type); gl_ShaderSource (shader, count, string, NULL); + + checkError ("compileShaderSource"); + compileAndCheck (shader); return shader; } @@ -329,6 +343,7 @@ void linkAndCheck(GLuint program) fprintf (stderr, "link log: %s\n", infoLog); free (infoLog); } + checkError ("linkAndCheck"); } void createProgram(GLuint vertexShader, GLuint fragmentShader) @@ -340,6 +355,9 @@ void createProgram(GLuint vertexShader, GLuint fragmentShader) if (fragmentShader != 0) { gl_AttachShader (program, fragmentShader); } + + checkError ("createProgram"); + linkAndCheck (program); } @@ -353,6 +371,8 @@ void initShader(void) GLuint fragmentShader = compileShaderSource (GL_FRAGMENT_SHADER, fragmentShaderLines, fragmentShaderSource); + checkError ("initShader - 1"); + createProgram (vertexShader, fragmentShader); gl_UseProgram (program); @@ -370,6 +390,8 @@ void initShader(void) shaderReady = -1; else shaderReady = 1; + + checkError ("initShader - 2"); } /* @@ -588,7 +610,7 @@ static void display(void) if (useShader && shaderReady) { - // setup use of shader (and vertex buffer by FreeGLUT) + /* setup use of shader (and vertex buffer by FreeGLUT) */ gl_UseProgram (program); glutSetVertexAttribCoord3(attribute_fg_coord); glutSetVertexAttribNormal(attribute_fg_normal); @@ -627,6 +649,8 @@ static void display(void) gl_UseProgram (0); glutSetVertexAttribCoord3(-1); glutSetVertexAttribNormal(-1); + + checkError ("display"); } else {