7 * Based on the original demo by:
8 * Stefan Gustavson (stegu@itn.liu.se) 2004, 2005
22 #define GETPROCADDRESS(F) wglGetProcAddress(F)
24 #define GETPROCADDRESS(F) glutGetProcAddress(F)
27 static GLhandleARB fragShader
;
28 static GLhandleARB vertShader
;
29 static GLhandleARB program
;
34 static GLint frames
= 0;
36 static GLfloat u_time
= 0.0f
;
38 static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB
= NULL
;
39 static PFNGLSHADERSOURCEARBPROC glShaderSourceARB
= NULL
;
40 static PFNGLCOMPILESHADERARBPROC glCompileShaderARB
= NULL
;
41 static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB
= NULL
;
42 static PFNGLATTACHOBJECTARBPROC glAttachObjectARB
= NULL
;
43 static PFNGLLINKPROGRAMARBPROC glLinkProgramARB
= NULL
;
44 static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB
= NULL
;
45 static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB
= NULL
;
46 static PFNGLUNIFORM1FARBPROC glUniform1fARB
= NULL
;
48 static void Redisplay (void)
52 glClear (GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
54 glUniform1fARB (uTime
, 0.5f
* u_time
);
57 glutSolidSphere (2.0, 20, 10);
63 t
= glutGet (GLUT_ELAPSED_TIME
);
65 GLfloat seconds
= (GLfloat
) (t
- t0
) / 1000.0f
;
66 GLfloat fps
= frames
/ seconds
;
67 printf ("%d frames in %6.3f seconds = %6.3f FPS\n", frames
, seconds
, fps
);
73 static void Idle (void)
79 static void Reshape (int width
, int height
)
81 glViewport (0, 0, width
, height
);
82 glMatrixMode (GL_PROJECTION
);
84 glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
85 glMatrixMode (GL_MODELVIEW
);
87 glTranslatef (0.0f
, 0.0f
, -15.0f
);
90 static void Key (unsigned char key
, int x
, int y
)
101 glutPostRedisplay ();
104 static void Init (void)
106 static const char *fragShaderText
=
107 "uniform float time;\n"
108 "varying vec3 position;\n"
110 " gl_FragColor = vec4 (vec3 (0.5 + 0.5 * noise1 (vec4 (position, time))), 1.0);\n"
113 static const char *vertShaderText
=
114 "varying vec3 position;\n"
116 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
117 " position = 4.0 * gl_Vertex.xyz;\n"
121 if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
123 printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
126 if (!glutExtensionSupported ("GL_ARB_shader_objects"))
128 printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
131 if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
133 printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
136 if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
138 printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
142 glCreateShaderObjectARB
= (PFNGLCREATESHADEROBJECTARBPROC
)
143 GETPROCADDRESS("glCreateShaderObjectARB");
144 glShaderSourceARB
= (PFNGLSHADERSOURCEARBPROC
)
145 GETPROCADDRESS("glShaderSourceARB");
146 glCompileShaderARB
= (PFNGLCOMPILESHADERARBPROC
)
147 GETPROCADDRESS("glCompileShaderARB");
148 glCreateProgramObjectARB
= (PFNGLCREATEPROGRAMOBJECTARBPROC
)
149 GETPROCADDRESS("glCreateProgramObjectARB");
150 glAttachObjectARB
= (PFNGLATTACHOBJECTARBPROC
)
151 GETPROCADDRESS("glAttachObjectARB");
152 glLinkProgramARB
= (PFNGLLINKPROGRAMARBPROC
)
153 GETPROCADDRESS ("glLinkProgramARB");
154 glUseProgramObjectARB
= (PFNGLUSEPROGRAMOBJECTARBPROC
)
155 GETPROCADDRESS("glUseProgramObjectARB");
157 glGetUniformLocationARB
= (PFNGLGETUNIFORMLOCATIONARBPROC
)
158 GETPROCADDRESS("glGetUniformLocationARB");
159 glUniform1fARB
= (PFNGLUNIFORM1FARBPROC
)
160 GETPROCADDRESS("glUniform1fARB");
162 fragShader
= glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB
);
163 glShaderSourceARB (fragShader
, 1, &fragShaderText
, NULL
);
164 glCompileShaderARB (fragShader
);
166 vertShader
= glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB
);
167 glShaderSourceARB (vertShader
, 1, &vertShaderText
, NULL
);
168 glCompileShaderARB (vertShader
);
170 program
= glCreateProgramObjectARB ();
171 glAttachObjectARB (program
, fragShader
);
172 glAttachObjectARB (program
, vertShader
);
173 glLinkProgramARB (program
);
174 glUseProgramObjectARB (program
);
176 uTime
= glGetUniformLocationARB (program
, "time");
178 glClearColor (0.0f
, 0.1f
, 0.3f
, 1.0f
);
179 glEnable (GL_CULL_FACE
);
180 glEnable (GL_DEPTH_TEST
);
182 printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER
));
185 int main (int argc
, char *argv
[])
187 glutInit (&argc
, argv
);
188 glutInitWindowPosition ( 0, 0);
189 glutInitWindowSize (200, 200);
190 glutInitDisplayMode (GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
191 glutCreateWindow (argv
[0]);
192 glutReshapeFunc (Reshape
);
193 glutKeyboardFunc (Key
);
194 glutDisplayFunc (Redisplay
);