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
);
74 static void Idle (void)
80 static void Reshape (int width
, int height
)
82 glViewport (0, 0, width
, height
);
83 glMatrixMode (GL_PROJECTION
);
85 glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
86 glMatrixMode (GL_MODELVIEW
);
88 glTranslatef (0.0f
, 0.0f
, -15.0f
);
91 static void Key (unsigned char key
, int x
, int y
)
102 glutPostRedisplay ();
105 static void Init (void)
107 static const char *fragShaderText
=
108 "uniform float time;\n"
109 "varying vec3 position;\n"
111 " gl_FragColor = vec4 (vec3 (0.5 + 0.5 * noise1 (vec4 (position, time))), 1.0);\n"
114 static const char *vertShaderText
=
115 "varying vec3 position;\n"
117 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
118 " position = 4.0 * gl_Vertex.xyz;\n"
122 if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
124 printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
127 if (!glutExtensionSupported ("GL_ARB_shader_objects"))
129 printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
132 if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
134 printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
137 if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
139 printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
143 glCreateShaderObjectARB
= (PFNGLCREATESHADEROBJECTARBPROC
)
144 GETPROCADDRESS("glCreateShaderObjectARB");
145 glShaderSourceARB
= (PFNGLSHADERSOURCEARBPROC
)
146 GETPROCADDRESS("glShaderSourceARB");
147 glCompileShaderARB
= (PFNGLCOMPILESHADERARBPROC
)
148 GETPROCADDRESS("glCompileShaderARB");
149 glCreateProgramObjectARB
= (PFNGLCREATEPROGRAMOBJECTARBPROC
)
150 GETPROCADDRESS("glCreateProgramObjectARB");
151 glAttachObjectARB
= (PFNGLATTACHOBJECTARBPROC
)
152 GETPROCADDRESS("glAttachObjectARB");
153 glLinkProgramARB
= (PFNGLLINKPROGRAMARBPROC
)
154 GETPROCADDRESS ("glLinkProgramARB");
155 glUseProgramObjectARB
= (PFNGLUSEPROGRAMOBJECTARBPROC
)
156 GETPROCADDRESS("glUseProgramObjectARB");
158 glGetUniformLocationARB
= (PFNGLGETUNIFORMLOCATIONARBPROC
)
159 GETPROCADDRESS("glGetUniformLocationARB");
160 glUniform1fARB
= (PFNGLUNIFORM1FARBPROC
)
161 GETPROCADDRESS("glUniform1fARB");
163 fragShader
= glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB
);
164 glShaderSourceARB (fragShader
, 1, &fragShaderText
, NULL
);
165 glCompileShaderARB (fragShader
);
167 vertShader
= glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB
);
168 glShaderSourceARB (vertShader
, 1, &vertShaderText
, NULL
);
169 glCompileShaderARB (vertShader
);
171 program
= glCreateProgramObjectARB ();
172 glAttachObjectARB (program
, fragShader
);
173 glAttachObjectARB (program
, vertShader
);
174 glLinkProgramARB (program
);
175 glUseProgramObjectARB (program
);
177 uTime
= glGetUniformLocationARB (program
, "time");
179 glClearColor (0.0f
, 0.1f
, 0.3f
, 1.0f
);
180 glEnable (GL_CULL_FACE
);
181 glEnable (GL_DEPTH_TEST
);
183 printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER
));
186 int main (int argc
, char *argv
[])
188 glutInit (&argc
, argv
);
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
);