blob: 10414393371c25ef6828a3b9a76fbdcd0d5eee7b [file] [log] [blame]
Michal Krol36541932006-02-18 15:11:18 +00001/*
2 * GLSL noise demo.
3 *
4 * Michal Krol
5 * 17 February 2006
6 *
7 * Based on the original demo by:
8 * Stefan Gustavson (stegu@itn.liu.se) 2004, 2005
9 */
10
11#ifdef WIN32
12#include <windows.h>
13#endif
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <GL/gl.h>
18#include <GL/glut.h>
19#include <GL/glext.h>
20
21#ifdef WIN32
22#define GETPROCADDRESS wglGetProcAddress
23#else
24#define GETPROCADDRESS glutGetProcAddress
25#endif
26
27static GLhandleARB fragShader;
28static GLhandleARB vertShader;
29static GLhandleARB program;
30
31static GLfloat u_time = 0.0f;
32
33static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
34static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
35static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
36static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
37static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
38static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
39static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
40
41static void Redisplay (void)
42{
43 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
44
45 /* XXX source from uniform time */
46 glTexCoord1f (u_time);
47
48 glPushMatrix ();
49 glutSolidSphere (2.0, 20, 10);
50 glPopMatrix ();
51
52 glutSwapBuffers();
53}
54
55static void Idle (void)
56{
57 u_time += 0.1f;
58 glutPostRedisplay ();
59}
60
61static void Reshape (int width, int height)
62{
63 glViewport (0, 0, width, height);
64 glMatrixMode (GL_PROJECTION);
65 glLoadIdentity ();
66 glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
67 glMatrixMode (GL_MODELVIEW);
68 glLoadIdentity ();
69 glTranslatef (0.0f, 0.0f, -15.0f);
70}
71
72static void Key (unsigned char key, int x, int y)
73{
74 (void) x;
75 (void) y;
76
77 switch (key)
78 {
79 case 27:
80 exit(0);
81 break;
82 }
83 glutPostRedisplay ();
84}
85
86static void Init (void)
87{
88 static const char *fragShaderText =
89 "void main () {\n"
90
91 /* XXX source from uniform time */
92 " float time;\n"
93 " time = gl_TexCoord[1].x;\n"
94
95 " vec4 v;\n"
96 " v = vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time);\n"
97 " gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (v))), 1.0);\n"
98 "}\n"
99 ;
100 static const char *vertShaderText =
101 "void main () {\n"
102 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
103 " gl_TexCoord[0] = gl_Vertex;\n"
104 " gl_FrontColor = gl_Color;\n"
105
106 /* XXX source from uniform time */
107 " gl_TexCoord[1] = gl_MultiTexCoord0;\n"
108 "}\n"
109 ;
110
111 if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
112 {
113 printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
114 exit(1);
115 }
116 if (!glutExtensionSupported ("GL_ARB_shader_objects"))
117 {
118 printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
119 exit(1);
120 }
121 if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
122 {
123 printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
124 exit(1);
125 }
126 if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
127 {
128 printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
129 exit(1);
130 }
131
132 glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) wglGetProcAddress ("glCreateShaderObjectARB");
133 glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) wglGetProcAddress ("glShaderSourceARB");
134 glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) wglGetProcAddress ("glCompileShaderARB");
135 glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glCreateProgramObjectARB");
136 glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) wglGetProcAddress ("glAttachObjectARB");
137 glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) wglGetProcAddress ("glLinkProgramARB");
138 glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) wglGetProcAddress ("glUseProgramObjectARB");
139
140 fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
141 glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
142 glCompileShaderARB (fragShader);
143
144 vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
145 glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
146 glCompileShaderARB (vertShader);
147
148 program = glCreateProgramObjectARB ();
149 glAttachObjectARB (program, fragShader);
150 glAttachObjectARB (program, vertShader);
151 glLinkProgramARB (program);
152 glUseProgramObjectARB (program);
153
154 glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
155 glEnable (GL_CULL_FACE);
156 glEnable (GL_DEPTH_TEST);
157
158 printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER));
159}
160
161int main (int argc, char *argv[])
162{
163 glutInit (&argc, argv);
164 glutInitWindowPosition ( 0, 0);
165 glutInitWindowSize (200, 200);
166 glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
167 glutCreateWindow (argv[0]);
168 glutReshapeFunc (Reshape);
169 glutKeyboardFunc (Key);
170 glutDisplayFunc (Redisplay);
171 glutIdleFunc (Idle);
172 Init ();
173 glutMainLoop ();
174 return 0;
175}
176