From cc1591667d55a6dbfafbd3d6a7afa9f9288c625d Mon Sep 17 00:00:00 2001 From: Michal Krol Date: Tue, 21 Feb 2006 12:35:06 +0000 Subject: More GLSL code: - uniforms (only GetLocation, Uniform1f and Uniform4fv for now for demos); - fix bugs and optimize array size handling; - 2D texture sampling (needs Enable(TEXTURE_2D) to work); - decrease built-in library assembly size by 30%. --- progs/demos/arbfslight.c | 43 ++++++++++++++++++++++--------------------- progs/demos/glslnoise.c | 31 +++++++++++++++---------------- 2 files changed, 37 insertions(+), 37 deletions(-) (limited to 'progs') diff --git a/progs/demos/arbfslight.c b/progs/demos/arbfslight.c index 2e91139bdd..1164f2d660 100644 --- a/progs/demos/arbfslight.c +++ b/progs/demos/arbfslight.c @@ -3,7 +3,7 @@ * simple per-pixel lighting. * * Michal Krol - * 17 February 2006 + * 20 February 2006 * * Based on the original demo by: * Brian Paul @@ -34,6 +34,10 @@ static GLfloat delta = 1.0f; static GLhandleARB fragShader; static GLhandleARB vertShader; static GLhandleARB program; + +static GLint uLightPos; +static GLint uDiffuse; +static GLint uSpecular; static GLboolean anim = GL_TRUE; static GLboolean wire = GL_FALSE; @@ -50,7 +54,9 @@ static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL; static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL; static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL; static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL; -static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; +static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; +static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL; +static PFNGLUNIFORM4FVARBPROC glUniform4fvARB = NULL; static void Redisplay (void) { @@ -59,8 +65,7 @@ static void Redisplay (void) if (pixelLight) { glUseProgramObjectARB (program); - /* XXX source from uniform lightPos */ - glTexCoord4fv (lightPos); + glUniform4fvARB (uLightPos, 1, lightPos); glDisable(GL_LIGHTING); } else @@ -181,21 +186,11 @@ static void SpecialKey (int key, int x, int y) static void Init (void) { - static const char *fragShaderText = + static const char *fragShaderText = + "uniform vec4 lightPos;\n" + "uniform vec4 diffuse;\n" + "uniform vec4 specular;\n" "void main () {\n" - - /* XXX source from uniform lightPos */ - " vec4 lightPos;\n" - " lightPos = gl_TexCoord[1];\n" - - /* XXX source from uniform diffuse */ - " vec4 diffuse;\n" - " diffuse = vec4 (0.5, 0.5, 1.0, 1.0);\n" - - /* XXX source from uniform specular */ - " vec4 specular;\n" - " specular = vec4 (0.8, 0.8, 0.8, 1.0);\n" - " // Compute dot product of light direction and normal vector\n" " float dotProd;\n" " dotProd = clamp (dot (normalize (lightPos).xyz, normalize (gl_TexCoord[0]).xyz), 0.0, 1.0);\n" @@ -207,9 +202,6 @@ static void Init (void) "void main () {\n" " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" " gl_TexCoord[0] = vec4 (gl_NormalMatrix * gl_Normal, 1.0);\n" - - /* XXX source from uniform lightPos */ - " gl_TexCoord[1] = gl_MultiTexCoord0;\n" "}\n" ; @@ -241,6 +233,8 @@ static void Init (void) glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) GETPROCADDRESS ("glAttachObjectARB"); glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) GETPROCADDRESS ("glLinkProgramARB"); glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glUseProgramObjectARB"); + glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) GETPROCADDRESS ("glGetUniformLocationARB"); + glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) GETPROCADDRESS ("glUniform4fvARB"); fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB); glShaderSourceARB (fragShader, 1, &fragShaderText, NULL); @@ -255,6 +249,13 @@ static void Init (void) glAttachObjectARB (program, vertShader); glLinkProgramARB (program); glUseProgramObjectARB (program); + + uLightPos = glGetUniformLocationARB (program, "lightPos"); + uDiffuse = glGetUniformLocationARB (program, "diffuse"); + uSpecular = glGetUniformLocationARB (program, "specular"); + + glUniform4fvARB (uDiffuse, 1, diffuse); + glUniform4fvARB (uSpecular, 1, specular); glClearColor (0.3f, 0.3f, 0.3f, 0.0f); glEnable (GL_DEPTH_TEST); diff --git a/progs/demos/glslnoise.c b/progs/demos/glslnoise.c index 1041439337..463af12897 100755 --- a/progs/demos/glslnoise.c +++ b/progs/demos/glslnoise.c @@ -2,7 +2,7 @@ * GLSL noise demo. * * Michal Krol - * 17 February 2006 + * 20 February 2006 * * Based on the original demo by: * Stefan Gustavson (stegu@itn.liu.se) 2004, 2005 @@ -28,6 +28,8 @@ static GLhandleARB fragShader; static GLhandleARB vertShader; static GLhandleARB program; +static GLint uTime; + static GLfloat u_time = 0.0f; static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL; @@ -36,14 +38,15 @@ static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL; static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL; static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL; static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL; -static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; +static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; +static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL; +static PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL; static void Redisplay (void) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - /* XXX source from uniform time */ - glTexCoord1f (u_time); + glUniform1fARB (uTime, u_time); glPushMatrix (); glutSolidSphere (2.0, 20, 10); @@ -85,16 +88,11 @@ static void Key (unsigned char key, int x, int y) static void Init (void) { - static const char *fragShaderText = + static const char *fragShaderText = + "uniform float time;\n" "void main () {\n" - - /* XXX source from uniform time */ - " float time;\n" - " time = gl_TexCoord[1].x;\n" - - " vec4 v;\n" - " v = vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time);\n" - " gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (v))), 1.0);\n" + " gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (\n" + " vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time)))), 1.0);\n" "}\n" ; static const char *vertShaderText = @@ -102,9 +100,6 @@ static void Init (void) " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" " gl_TexCoord[0] = gl_Vertex;\n" " gl_FrontColor = gl_Color;\n" - - /* XXX source from uniform time */ - " gl_TexCoord[1] = gl_MultiTexCoord0;\n" "}\n" ; @@ -136,6 +131,8 @@ static void Init (void) glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) wglGetProcAddress ("glAttachObjectARB"); glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) wglGetProcAddress ("glLinkProgramARB"); glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glUseProgramObjectARB"); + glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) GETPROCADDRESS ("glGetUniformLocationARB"); + glUniform1fARB = (PFNGLUNIFORM1FARBPROC) GETPROCADDRESS ("glUniform1fARB"); fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB); glShaderSourceARB (fragShader, 1, &fragShaderText, NULL); @@ -150,6 +147,8 @@ static void Init (void) glAttachObjectARB (program, vertShader); glLinkProgramARB (program); glUseProgramObjectARB (program); + + uTime = glGetUniformLocationARB (program, "time"); glClearColor (0.0f, 0.1f, 0.3f, 1.0f); glEnable (GL_CULL_FACE); -- cgit v1.2.3