blob: 2adb114e668e90c96fc39d0e47278bdccf4334d5 [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
33static GLfloat u_time = 0.0f;
34
35static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
36static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
37static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
38static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
39static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
40static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
41static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
42static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
Michal Krolcc159162006-02-21 12:35:06 +000043static PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
Michal Krol36541932006-02-18 15:11:18 +000044
45static void Redisplay (void)
46{
Brian Paul62c325a2006-03-29 23:20:49 +000047 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
48
Michal Krolcc159162006-02-21 12:35:06 +000049 glUniform1fARB (uTime, u_time);
Michal Krol36541932006-02-18 15:11:18 +000050
51 glPushMatrix ();
Brian Paul62c325a2006-03-29 23:20:49 +000052 glutSolidSphere (2.0, 20, 10);
Michal Krol36541932006-02-18 15:11:18 +000053 glPopMatrix ();
54
55 glutSwapBuffers();
56}
57
58static void Idle (void)
Brian Paul62c325a2006-03-29 23:20:49 +000059{
Michal Krol36541932006-02-18 15:11:18 +000060 u_time += 0.1f;
61 glutPostRedisplay ();
62}
63
64static void Reshape (int width, int height)
65{
66 glViewport (0, 0, width, height);
67 glMatrixMode (GL_PROJECTION);
68 glLoadIdentity ();
69 glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
70 glMatrixMode (GL_MODELVIEW);
71 glLoadIdentity ();
72 glTranslatef (0.0f, 0.0f, -15.0f);
73}
74
75static void Key (unsigned char key, int x, int y)
76{
77 (void) x;
Brian Paul62c325a2006-03-29 23:20:49 +000078 (void) y;
Michal Krol36541932006-02-18 15:11:18 +000079
Brian Paul62c325a2006-03-29 23:20:49 +000080 switch (key)
Michal Krol36541932006-02-18 15:11:18 +000081 {
82 case 27:
83 exit(0);
84 break;
85 }
86 glutPostRedisplay ();
87}
88
89static void Init (void)
90{
Brian Paul62c325a2006-03-29 23:20:49 +000091 static const char *fragShaderText =
Michal Krolcc159162006-02-21 12:35:06 +000092 "uniform float time;\n"
Brian Paul62c325a2006-03-29 23:20:49 +000093 "void main () {\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"
Michal Krol36541932006-02-18 15:11:18 +000096 "}\n"
97 ;
98 static const char *vertShaderText =
Brian Paul62c325a2006-03-29 23:20:49 +000099 "void main () {\n"
100 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
101 " gl_TexCoord[0] = gl_Vertex;\n"
102 " gl_FrontColor = gl_Color;\n"
Michal Krol36541932006-02-18 15:11:18 +0000103 "}\n"
104 ;
Brian Paul62c325a2006-03-29 23:20:49 +0000105
106 if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
Michal Krol36541932006-02-18 15:11:18 +0000107 {
108 printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
109 exit(1);
Brian Paul62c325a2006-03-29 23:20:49 +0000110 }
111 if (!glutExtensionSupported ("GL_ARB_shader_objects"))
112 {
113 printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
114 exit(1);
115 }
116 if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
117 {
118 printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
119 exit(1);
120 }
121 if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
122 {
123 printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
124 exit(1);
Michal Krol36541932006-02-18 15:11:18 +0000125 }
126
Brian Paul62c325a2006-03-29 23:20:49 +0000127 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");
Michal Krol36541932006-02-18 15:11:18 +0000141
Brian Paul62c325a2006-03-29 23:20:49 +0000142 glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
143 GETPROCADDRESS("glGetUniformLocationARB");
144 glUniform1fARB = (PFNGLUNIFORM1FARBPROC)
145 GETPROCADDRESS("glUniform1fARB");
146
147 fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
148 glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
149 glCompileShaderARB (fragShader);
150
151 vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
152 glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
153 glCompileShaderARB (vertShader);
154
155 program = glCreateProgramObjectARB ();
156 glAttachObjectARB (program, fragShader);
157 glAttachObjectARB (program, vertShader);
158 glLinkProgramARB (program);
159 glUseProgramObjectARB (program);
160
161 uTime = glGetUniformLocationARB (program, "time");
162
163 glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
Michal Krol36541932006-02-18 15:11:18 +0000164 glEnable (GL_CULL_FACE);
165 glEnable (GL_DEPTH_TEST);
166
167 printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER));
168}
169
170int main (int argc, char *argv[])
171{
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);
180 glutIdleFunc (Idle);
181 Init ();
182 glutMainLoop ();
183 return 0;
184}
Brian Paul62c325a2006-03-29 23:20:49 +0000185