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
;
33 static GLfloat u_time
= 0.0f
;
35 static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB
= NULL
;
36 static PFNGLSHADERSOURCEARBPROC glShaderSourceARB
= NULL
;
37 static PFNGLCOMPILESHADERARBPROC glCompileShaderARB
= NULL
;
38 static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB
= NULL
;
39 static PFNGLATTACHOBJECTARBPROC glAttachObjectARB
= NULL
;
40 static PFNGLLINKPROGRAMARBPROC glLinkProgramARB
= NULL
;
41 static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB
= NULL
;
42 static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB
= NULL
;
43 static PFNGLUNIFORM1FARBPROC glUniform1fARB
= NULL
;
45 static void Redisplay (void)
47 glClear (GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
49 glUniform1fARB (uTime
, u_time
);
52 glutSolidSphere (2.0, 20, 10);
58 static void Idle (void)
64 static void Reshape (int width
, int height
)
66 glViewport (0, 0, width
, height
);
67 glMatrixMode (GL_PROJECTION
);
69 glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
70 glMatrixMode (GL_MODELVIEW
);
72 glTranslatef (0.0f
, 0.0f
, -15.0f
);
75 static void Key (unsigned char key
, int x
, int y
)
89 static void Init (void)
91 static const char *fragShaderText
=
92 "uniform float time;\n"
94 " gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (\n"
95 " vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time)))), 1.0);\n"
98 static const char *vertShaderText
=
100 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
101 " gl_TexCoord[0] = gl_Vertex;\n"
102 " gl_FrontColor = gl_Color;\n"
106 if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
108 printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
111 if (!glutExtensionSupported ("GL_ARB_shader_objects"))
113 printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
116 if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
118 printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
121 if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
123 printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
127 glCreateShaderObjectARB
= (PFNGLCREATESHADEROBJECTARBPROC
)
128 GETPROCADDRESS("glCreateShaderObjectARB");
129 glShaderSourceARB
= (PFNGLSHADERSOURCEARBPROC
)
130 GETPROCADDRESS("glShaderSourceARB");
131 glCompileShaderARB
= (PFNGLCOMPILESHADERARBPROC
)
132 GETPROCADDRESS("glCompileShaderARB");
133 glCreateProgramObjectARB
= (PFNGLCREATEPROGRAMOBJECTARBPROC
)
134 GETPROCADDRESS("glCreateProgramObjectARB");
135 glAttachObjectARB
= (PFNGLATTACHOBJECTARBPROC
)
136 GETPROCADDRESS("glAttachObjectARB");
137 glLinkProgramARB
= (PFNGLLINKPROGRAMARBPROC
)
138 GETPROCADDRESS ("glLinkProgramARB");
139 glUseProgramObjectARB
= (PFNGLUSEPROGRAMOBJECTARBPROC
)
140 GETPROCADDRESS("glUseProgramObjectARB");
142 glGetUniformLocationARB
= (PFNGLGETUNIFORMLOCATIONARBPROC
)
143 GETPROCADDRESS("glGetUniformLocationARB");
144 glUniform1fARB
= (PFNGLUNIFORM1FARBPROC
)
145 GETPROCADDRESS("glUniform1fARB");
147 fragShader
= glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB
);
148 glShaderSourceARB (fragShader
, 1, &fragShaderText
, NULL
);
149 glCompileShaderARB (fragShader
);
151 vertShader
= glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB
);
152 glShaderSourceARB (vertShader
, 1, &vertShaderText
, NULL
);
153 glCompileShaderARB (vertShader
);
155 program
= glCreateProgramObjectARB ();
156 glAttachObjectARB (program
, fragShader
);
157 glAttachObjectARB (program
, vertShader
);
158 glLinkProgramARB (program
);
159 glUseProgramObjectARB (program
);
161 uTime
= glGetUniformLocationARB (program
, "time");
163 glClearColor (0.0f
, 0.1f
, 0.3f
, 1.0f
);
164 glEnable (GL_CULL_FACE
);
165 glEnable (GL_DEPTH_TEST
);
167 printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER
));
170 int main (int argc
, char *argv
[])
172 glutInit (&argc
, argv
);
173 glutInitWindowPosition ( 0, 0);
174 glutInitWindowSize (200, 200);
175 glutInitDisplayMode (GLUT_RGB
| GLUT_DOUBLE
| GLUT_DEPTH
);
176 glutCreateWindow (argv
[0]);
177 glutReshapeFunc (Reshape
);
178 glutKeyboardFunc (Key
);
179 glutDisplayFunc (Redisplay
);