blob: 7a28f09947c26a5fbe16d8a0cc1f27466712a8e5 [file] [log] [blame]
Michal Krol36541932006-02-18 15:11:18 +00001/*
2 * GLSL noise demo.
Brian Paul62c325a2006-03-29 23:20:49 +00003 *
4 * Michal Krol
Michal Krolcc159162006-02-21 12:35:06 +00005 * 20 February 2006
Brian Paul62c325a2006-03-29 23:20:49 +00006 *
Michal Krol36541932006-02-18 15:11:18 +00007 * Based on the original demo by:
8 * Stefan Gustavson (stegu@itn.liu.se) 2004, 2005
Brian Paul62c325a2006-03-29 23:20:49 +00009 */
10
11#ifdef WIN32
12#include <windows.h>
Michal Krol36541932006-02-18 15:11:18 +000013#endif
14
15#include <stdio.h>
16#include <stdlib.h>
Brian Paul62c325a2006-03-29 23:20:49 +000017#include <GL/gl.h>
18#include <GL/glut.h>
19#include <GL/glext.h>
20
21#ifdef WIN32
22#define GETPROCADDRESS(F) wglGetProcAddress(F)
23#else
24#define GETPROCADDRESS(F) glutGetProcAddress(F)
25#endif
Michal Krol36541932006-02-18 15:11:18 +000026
27static GLhandleARB fragShader;
Brian Paul62c325a2006-03-29 23:20:49 +000028static GLhandleARB vertShader;
29static GLhandleARB program;
Michal Krol36541932006-02-18 15:11:18 +000030
Brian Paul62c325a2006-03-29 23:20:49 +000031static GLint uTime;
32
Michal Krol39dd5192006-07-29 09:42:03 +000033static GLint t0 = 0;
34static GLint frames = 0;
35
Brian Paul62c325a2006-03-29 23:20:49 +000036static GLfloat u_time = 0.0f;
37
38static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
39static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
40static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
41static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
42static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
43static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
44static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
45static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
Michal Krolcc159162006-02-21 12:35:06 +000046static PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
Michal Krol36541932006-02-18 15:11:18 +000047
48static void Redisplay (void)
49{
Michal Krol39dd5192006-07-29 09:42:03 +000050 GLint t;
51
Brian Paul62c325a2006-03-29 23:20:49 +000052 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
53
Michal Krol39dd5192006-07-29 09:42:03 +000054 glUniform1fARB (uTime, 0.5f * u_time);
Michal Krol36541932006-02-18 15:11:18 +000055
56 glPushMatrix ();
Brian Paul62c325a2006-03-29 23:20:49 +000057 glutSolidSphere (2.0, 20, 10);
Michal Krol36541932006-02-18 15:11:18 +000058 glPopMatrix ();
59
60 glutSwapBuffers();
Michal Krol39dd5192006-07-29 09:42:03 +000061 frames++;
62
63 t = glutGet (GLUT_ELAPSED_TIME);
64 if (t - t0 >= 5000) {
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);
Keith Whitwelle6479c62009-02-24 12:02:24 +000068 fflush(stdout);
Michal Krol39dd5192006-07-29 09:42:03 +000069 t0 = t;
70 frames = 0;
71 }
Michal Krol36541932006-02-18 15:11:18 +000072}
73
74static void Idle (void)
Brian Paul62c325a2006-03-29 23:20:49 +000075{
Michal Krol36541932006-02-18 15:11:18 +000076 u_time += 0.1f;
77 glutPostRedisplay ();
78}
79
80static void Reshape (int width, int height)
81{
82 glViewport (0, 0, width, height);
83 glMatrixMode (GL_PROJECTION);
84 glLoadIdentity ();
85 glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
86 glMatrixMode (GL_MODELVIEW);
87 glLoadIdentity ();
88 glTranslatef (0.0f, 0.0f, -15.0f);
89}
90
91static void Key (unsigned char key, int x, int y)
92{
93 (void) x;
Brian Paul62c325a2006-03-29 23:20:49 +000094 (void) y;
Michal Krol36541932006-02-18 15:11:18 +000095
Brian Paul62c325a2006-03-29 23:20:49 +000096 switch (key)
Michal Krol36541932006-02-18 15:11:18 +000097 {
98 case 27:
99 exit(0);
100 break;
101 }
102 glutPostRedisplay ();
103}
104
105static void Init (void)
106{
Michal Krol39dd5192006-07-29 09:42:03 +0000107 static const char *fragShaderText =
108 "uniform float time;\n"
109 "varying vec3 position;\n"
110 "void main () {\n"
111 " gl_FragColor = vec4 (vec3 (0.5 + 0.5 * noise1 (vec4 (position, time))), 1.0);\n"
112 "}\n"
113 ;
114 static const char *vertShaderText =
115 "varying vec3 position;\n"
116 "void main () {\n"
117 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
118 " position = 4.0 * gl_Vertex.xyz;\n"
119 "}\n"
120 ;
Brian Paul62c325a2006-03-29 23:20:49 +0000121
122 if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
Michal Krol36541932006-02-18 15:11:18 +0000123 {
124 printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
125 exit(1);
Brian Paul62c325a2006-03-29 23:20:49 +0000126 }
127 if (!glutExtensionSupported ("GL_ARB_shader_objects"))
128 {
129 printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
130 exit(1);
131 }
132 if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
133 {
134 printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
135 exit(1);
136 }
137 if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
138 {
139 printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
140 exit(1);
Michal Krol36541932006-02-18 15:11:18 +0000141 }
142
Brian Paul62c325a2006-03-29 23:20:49 +0000143 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");
Michal Krol36541932006-02-18 15:11:18 +0000157
Brian Paul62c325a2006-03-29 23:20:49 +0000158 glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
159 GETPROCADDRESS("glGetUniformLocationARB");
160 glUniform1fARB = (PFNGLUNIFORM1FARBPROC)
161 GETPROCADDRESS("glUniform1fARB");
162
163 fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
164 glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
165 glCompileShaderARB (fragShader);
166
167 vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
168 glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
169 glCompileShaderARB (vertShader);
170
171 program = glCreateProgramObjectARB ();
172 glAttachObjectARB (program, fragShader);
173 glAttachObjectARB (program, vertShader);
174 glLinkProgramARB (program);
175 glUseProgramObjectARB (program);
176
177 uTime = glGetUniformLocationARB (program, "time");
178
179 glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
Michal Krol36541932006-02-18 15:11:18 +0000180 glEnable (GL_CULL_FACE);
181 glEnable (GL_DEPTH_TEST);
182
183 printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER));
184}
185
186int main (int argc, char *argv[])
187{
188 glutInit (&argc, argv);
Michal Krol36541932006-02-18 15:11:18 +0000189 glutInitWindowSize (200, 200);
190 glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
191 glutCreateWindow (argv[0]);
192 glutReshapeFunc (Reshape);
193 glutKeyboardFunc (Key);
194 glutDisplayFunc (Redisplay);
195 glutIdleFunc (Idle);
196 Init ();
197 glutMainLoop ();
198 return 0;
199}
Brian Paul62c325a2006-03-29 23:20:49 +0000200