diff options
author | Michal Krol <[email protected]> | 2006-02-18 15:11:18 +0000 |
---|---|---|
committer | Michal Krol <[email protected]> | 2006-02-18 15:11:18 +0000 |
commit | 3654193a4d417560c90b4bbe47d8070919cdc348 (patch) | |
tree | 9c984f7fe482f9af08575d6b3338cd4128e5455c /progs/demos | |
parent | e94be8d5c0b28c4eecf8492cb07ae9dff9026ada (diff) |
More GLSL code.
- general constructors allowed;
- implement noise functions (from Stefan Gustavson - thanks!)
- cosmetic stuff.
Diffstat (limited to 'progs/demos')
-rw-r--r-- | progs/demos/Makefile | 1 | ||||
-rw-r--r-- | progs/demos/arbfslight.c | 49 | ||||
-rwxr-xr-x | progs/demos/glslnoise.c | 176 |
3 files changed, 203 insertions, 23 deletions
diff --git a/progs/demos/Makefile b/progs/demos/Makefile index 39674b0ce20..dda2170c342 100644 --- a/progs/demos/Makefile +++ b/progs/demos/Makefile @@ -30,6 +30,7 @@ PROGS = \ geartrain \ glinfo \ gloss \ + glslnoise.c \ gltestperf \ glutfx \ isosurf \ diff --git a/progs/demos/arbfslight.c b/progs/demos/arbfslight.c index e5cfadc9916..2e91139bdd4 100644 --- a/progs/demos/arbfslight.c +++ b/progs/demos/arbfslight.c @@ -3,16 +3,28 @@ * simple per-pixel lighting.
*
* Michal Krol
- * 14 February 2006 + * 17 February 2006 *
* Based on the original demo by: * Brian Paul * 17 April 2003 - */ + */
+
+#ifdef WIN32
+#include <windows.h>
+#endif #include <stdio.h> -#include <stdlib.h> +#include <stdlib.h>
+#include <GL/gl.h> #include <GL/glut.h>
+#include <GL/glext.h>
+
+#ifdef WIN32
+#define GETPROCADDRESS wglGetProcAddress
+#else
+#define GETPROCADDRESS glutGetProcAddress
+#endif
static GLfloat diffuse[4] = { 0.5f, 0.5f, 1.0f, 1.0f }; static GLfloat specular[4] = { 0.8f, 0.8f, 0.8f, 1.0f }; @@ -178,23 +190,15 @@ static void Init (void) /* XXX source from uniform diffuse */
" vec4 diffuse;\n"
- " diffuse.xy = vec2 (0.5);\n"
- " diffuse.zw = vec2 (1.0);\n"
+ " diffuse = vec4 (0.5, 0.5, 1.0, 1.0);\n"
/* XXX source from uniform specular */
" vec4 specular;\n"
- " specular.xyz = vec3 (0.8);\n"
- " specular.w = 1.0;\n"
+ " specular = vec4 (0.8, 0.8, 0.8, 1.0);\n"
- " // Compute normalized light direction\n"
- " vec4 lightDir;\n"
- " lightDir = lightPos / length (lightPos);\n"
- " // Compute normalized normal\n"
- " vec4 normal;\n"
- " normal = gl_TexCoord[0] / length (gl_TexCoord[0]);\n"
" // Compute dot product of light direction and normal vector\n"
" float dotProd;\n"
- " dotProd = clamp (dot (lightDir.xyz, normal.xyz), 0.0, 1.0);\n"
+ " dotProd = clamp (dot (normalize (lightPos).xyz, normalize (gl_TexCoord[0]).xyz), 0.0, 1.0);\n"
" // Compute diffuse and specular contributions\n"
" gl_FragColor = diffuse * dotProd + specular * pow (dotProd, 20.0);\n"
"}\n" @@ -202,8 +206,7 @@ static void Init (void) static const char *vertShaderText = "void main () {\n"
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
- " gl_TexCoord[0].xyz = gl_NormalMatrix * gl_Normal;\n"
- " gl_TexCoord[0].w = 1.0;\n"
+ " gl_TexCoord[0] = vec4 (gl_NormalMatrix * gl_Normal, 1.0);\n"
/* XXX source from uniform lightPos */
" gl_TexCoord[1] = gl_MultiTexCoord0;\n"
@@ -231,13 +234,13 @@ static void Init (void) exit(1);
} - glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) glutGetProcAddress ("glCreateShaderObjectARB");
- glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) glutGetProcAddress ("glShaderSourceARB");
- glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) glutGetProcAddress ("glCompileShaderARB");
- glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) glutGetProcAddress ("glCreateProgramObjectARB");
- glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) glutGetProcAddress ("glAttachObjectARB");
- glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) glutGetProcAddress ("glLinkProgramARB");
- glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) glutGetProcAddress ("glUseProgramObjectARB");
+ glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) GETPROCADDRESS ("glCreateShaderObjectARB");
+ glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) GETPROCADDRESS ("glShaderSourceARB");
+ glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) GETPROCADDRESS ("glCompileShaderARB");
+ glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glCreateProgramObjectARB");
+ glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) GETPROCADDRESS ("glAttachObjectARB");
+ glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) GETPROCADDRESS ("glLinkProgramARB");
+ glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glUseProgramObjectARB");
fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
diff --git a/progs/demos/glslnoise.c b/progs/demos/glslnoise.c new file mode 100755 index 00000000000..10414393371 --- /dev/null +++ b/progs/demos/glslnoise.c @@ -0,0 +1,176 @@ +/* + * GLSL noise demo. + *
+ * Michal Krol
+ * 17 February 2006 + *
+ * Based on the original demo by: + * Stefan Gustavson ([email protected]) 2004, 2005 + */
+
+#ifdef WIN32
+#include <windows.h>
+#endif + +#include <stdio.h> +#include <stdlib.h> +#include <GL/gl.h>
+#include <GL/glut.h>
+#include <GL/glext.h>
+
+#ifdef WIN32
+#define GETPROCADDRESS wglGetProcAddress
+#else
+#define GETPROCADDRESS glutGetProcAddress
+#endif
+ +static GLhandleARB fragShader; +static GLhandleARB vertShader;
+static GLhandleARB program;
+
+static GLfloat u_time = 0.0f;
+ +static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
+static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
+static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
+static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
+static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
+static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
+static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; + +static void Redisplay (void) +{ + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* XXX source from uniform time */
+ glTexCoord1f (u_time); + + glPushMatrix (); + glutSolidSphere (2.0, 20, 10);
+ glPopMatrix (); + + glutSwapBuffers(); +} + +static void Idle (void) +{
+ u_time += 0.1f; + glutPostRedisplay (); +} + +static void Reshape (int width, int height) +{ + glViewport (0, 0, width, height); + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); + glMatrixMode (GL_MODELVIEW); + glLoadIdentity (); + glTranslatef (0.0f, 0.0f, -15.0f); +} + +static void Key (unsigned char key, int x, int y) +{ + (void) x; + (void) y;
+ + switch (key)
+ { + case 27: + exit(0); + break; + } + glutPostRedisplay (); +} + +static void Init (void) +{ + static const char *fragShaderText = + "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"
+ "}\n" + ; + static const char *vertShaderText = + "void main () {\n"
+ " 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" + ; +
+ if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
+ { + printf ("Sorry, this demo requires GL_ARB_fragment_shader\n"); + exit(1); + }
+ if (!glutExtensionSupported ("GL_ARB_shader_objects"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
+ exit(1);
+ } + + glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) wglGetProcAddress ("glCreateShaderObjectARB");
+ glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) wglGetProcAddress ("glShaderSourceARB");
+ glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) wglGetProcAddress ("glCompileShaderARB");
+ glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glCreateProgramObjectARB");
+ glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) wglGetProcAddress ("glAttachObjectARB");
+ glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) wglGetProcAddress ("glLinkProgramARB");
+ glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glUseProgramObjectARB");
+
+ fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
+ glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
+ glCompileShaderARB (fragShader); +
+ vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
+ glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
+ glCompileShaderARB (vertShader);
+
+ program = glCreateProgramObjectARB ();
+ glAttachObjectARB (program, fragShader);
+ glAttachObjectARB (program, vertShader);
+ glLinkProgramARB (program);
+ glUseProgramObjectARB (program);
+ + glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
+ glEnable (GL_CULL_FACE); + glEnable (GL_DEPTH_TEST); + + printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER)); +} + +int main (int argc, char *argv[]) +{ + glutInit (&argc, argv); + glutInitWindowPosition ( 0, 0); + glutInitWindowSize (200, 200); + glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); + glutCreateWindow (argv[0]); + glutReshapeFunc (Reshape); + glutKeyboardFunc (Key); + glutDisplayFunc (Redisplay); + glutIdleFunc (Idle); + Init (); + glutMainLoop (); + return 0; +} +
|