Michal Krol | 3654193 | 2006-02-18 15:11:18 +0000 | [diff] [blame^] | 1 | /* |
| 2 | * GLSL noise demo. |
| 3 | *
|
| 4 | * Michal Krol
|
| 5 | * 17 February 2006 |
| 6 | *
|
| 7 | * Based on the original demo by: |
| 8 | * Stefan Gustavson (stegu@itn.liu.se) 2004, 2005 |
| 9 | */
|
| 10 |
|
| 11 | #ifdef WIN32
|
| 12 | #include <windows.h>
|
| 13 | #endif |
| 14 | |
| 15 | #include <stdio.h> |
| 16 | #include <stdlib.h> |
| 17 | #include <GL/gl.h>
|
| 18 | #include <GL/glut.h>
|
| 19 | #include <GL/glext.h>
|
| 20 |
|
| 21 | #ifdef WIN32
|
| 22 | #define GETPROCADDRESS wglGetProcAddress
|
| 23 | #else
|
| 24 | #define GETPROCADDRESS glutGetProcAddress
|
| 25 | #endif
|
| 26 | |
| 27 | static GLhandleARB fragShader; |
| 28 | static GLhandleARB vertShader;
|
| 29 | static GLhandleARB program;
|
| 30 |
|
| 31 | static GLfloat u_time = 0.0f;
|
| 32 | |
| 33 | static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
|
| 34 | static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
|
| 35 | static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
|
| 36 | static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
|
| 37 | static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
|
| 38 | static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
|
| 39 | static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; |
| 40 | |
| 41 | static void Redisplay (void) |
| 42 | { |
| 43 | glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
| 44 |
|
| 45 | /* XXX source from uniform time */
|
| 46 | glTexCoord1f (u_time); |
| 47 | |
| 48 | glPushMatrix (); |
| 49 | glutSolidSphere (2.0, 20, 10);
|
| 50 | glPopMatrix (); |
| 51 | |
| 52 | glutSwapBuffers(); |
| 53 | } |
| 54 | |
| 55 | static void Idle (void) |
| 56 | {
|
| 57 | u_time += 0.1f; |
| 58 | glutPostRedisplay (); |
| 59 | } |
| 60 | |
| 61 | static void Reshape (int width, int height) |
| 62 | { |
| 63 | glViewport (0, 0, width, height); |
| 64 | glMatrixMode (GL_PROJECTION); |
| 65 | glLoadIdentity (); |
| 66 | glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); |
| 67 | glMatrixMode (GL_MODELVIEW); |
| 68 | glLoadIdentity (); |
| 69 | glTranslatef (0.0f, 0.0f, -15.0f); |
| 70 | } |
| 71 | |
| 72 | static void Key (unsigned char key, int x, int y) |
| 73 | { |
| 74 | (void) x; |
| 75 | (void) y;
|
| 76 | |
| 77 | switch (key)
|
| 78 | { |
| 79 | case 27: |
| 80 | exit(0); |
| 81 | break; |
| 82 | } |
| 83 | glutPostRedisplay (); |
| 84 | } |
| 85 | |
| 86 | static void Init (void) |
| 87 | { |
| 88 | static const char *fragShaderText = |
| 89 | "void main () {\n"
|
| 90 |
|
| 91 | /* XXX source from uniform time */
|
| 92 | " float time;\n"
|
| 93 | " time = gl_TexCoord[1].x;\n"
|
| 94 |
|
| 95 | " vec4 v;\n"
|
| 96 | " v = vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time);\n"
|
| 97 | " gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (v))), 1.0);\n"
|
| 98 | "}\n" |
| 99 | ; |
| 100 | static const char *vertShaderText = |
| 101 | "void main () {\n"
|
| 102 | " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
|
| 103 | " gl_TexCoord[0] = gl_Vertex;\n"
|
| 104 | " gl_FrontColor = gl_Color;\n"
|
| 105 |
|
| 106 | /* XXX source from uniform time */
|
| 107 | " gl_TexCoord[1] = gl_MultiTexCoord0;\n"
|
| 108 | "}\n" |
| 109 | ; |
| 110 |
|
| 111 | if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
|
| 112 | { |
| 113 | printf ("Sorry, this demo requires GL_ARB_fragment_shader\n"); |
| 114 | exit(1); |
| 115 | }
|
| 116 | if (!glutExtensionSupported ("GL_ARB_shader_objects"))
|
| 117 | {
|
| 118 | printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
|
| 119 | exit(1);
|
| 120 | }
|
| 121 | if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
|
| 122 | {
|
| 123 | printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
|
| 124 | exit(1);
|
| 125 | }
|
| 126 | if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
|
| 127 | {
|
| 128 | printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
|
| 129 | exit(1);
|
| 130 | } |
| 131 | |
| 132 | glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) wglGetProcAddress ("glCreateShaderObjectARB");
|
| 133 | glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) wglGetProcAddress ("glShaderSourceARB");
|
| 134 | glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) wglGetProcAddress ("glCompileShaderARB");
|
| 135 | glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glCreateProgramObjectARB");
|
| 136 | glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) wglGetProcAddress ("glAttachObjectARB");
|
| 137 | glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) wglGetProcAddress ("glLinkProgramARB");
|
| 138 | glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glUseProgramObjectARB");
|
| 139 |
|
| 140 | fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
|
| 141 | glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
|
| 142 | glCompileShaderARB (fragShader); |
| 143 |
|
| 144 | vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
|
| 145 | glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
|
| 146 | glCompileShaderARB (vertShader);
|
| 147 |
|
| 148 | program = glCreateProgramObjectARB ();
|
| 149 | glAttachObjectARB (program, fragShader);
|
| 150 | glAttachObjectARB (program, vertShader);
|
| 151 | glLinkProgramARB (program);
|
| 152 | glUseProgramObjectARB (program);
|
| 153 | |
| 154 | glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
|
| 155 | glEnable (GL_CULL_FACE); |
| 156 | glEnable (GL_DEPTH_TEST); |
| 157 | |
| 158 | printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER)); |
| 159 | } |
| 160 | |
| 161 | int main (int argc, char *argv[]) |
| 162 | { |
| 163 | glutInit (&argc, argv); |
| 164 | glutInitWindowPosition ( 0, 0); |
| 165 | glutInitWindowSize (200, 200); |
| 166 | glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); |
| 167 | glutCreateWindow (argv[0]); |
| 168 | glutReshapeFunc (Reshape); |
| 169 | glutKeyboardFunc (Key); |
| 170 | glutDisplayFunc (Redisplay); |
| 171 | glutIdleFunc (Idle); |
| 172 | Init (); |
| 173 | glutMainLoop (); |
| 174 | return 0; |
| 175 | } |
| 176 |
|