Demos (master): simplex-noise: test of GLSL "webgl-noise"
Brian Paul
brianp at kemper.freedesktop.org
Fri Mar 18 03:58:49 UTC 2011
Module: Demos
Branch: master
Commit: a9ca2f1c0e4d6d0a4ae523d0b68929c210c13219
URL: http://cgit.freedesktop.org/mesa/demos/commit/?id=a9ca2f1c0e4d6d0a4ae523d0b68929c210c13219
Author: Brian Paul <brianp at vmware.com>
Date: Thu Mar 17 21:53:28 2011 -0600
simplex-noise: test of GLSL "webgl-noise"
See http://github.com/ashima/webgl-noise
---
src/glsl/Makefile.am | 2 +
src/glsl/simplex-noise.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 237 insertions(+), 0 deletions(-)
diff --git a/src/glsl/Makefile.am b/src/glsl/Makefile.am
index 154189a..294a5f5 100644
--- a/src/glsl/Makefile.am
+++ b/src/glsl/Makefile.am
@@ -54,6 +54,7 @@ bin_PROGRAMS = \
samplers_array \
shadow_sampler \
shtest \
+ simplex-noise \
skinning \
texaaline \
texdemo1 \
@@ -82,6 +83,7 @@ linktest_LDADD = ../util/libutil.la
mandelbrot_LDADD = ../util/libutil.la
multitex_LDADD = ../util/libutil.la
noise_LDADD = ../util/libutil.la
+simplex_noise_LDADD = ../util/libutil.la
pointcoord_LDADD = ../util/libutil.la
points_LDADD = ../util/libutil.la
samplers_LDADD = ../util/libutil.la
diff --git a/src/glsl/simplex-noise.c b/src/glsl/simplex-noise.c
new file mode 100644
index 0000000..448b1ce
--- /dev/null
+++ b/src/glsl/simplex-noise.c
@@ -0,0 +1,235 @@
+/**
+ * Test/demo of Ian McEwan's simplex noise function.
+ * See https://github.com/ashima/webgl-noise
+ *
+ * Brian Paul
+ * 17 March 2011
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glew.h>
+#include <GL/glut.h>
+#include "shaderutil.h"
+
+
+static const char *VertShaderText =
+ "void main() {\n"
+ " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
+ " gl_TexCoord[0] = gl_MultiTexCoord0;\n"
+ "}\n";
+
+static const char *FragShaderMainText =
+ "uniform float Slice;\n"
+ "void main()\n"
+ "{\n"
+ " vec3 c = vec3(3.0 * gl_TexCoord[0].xy, Slice);\n"
+ " float r = simplexNoise3(c); \n"
+ " gl_FragColor = vec4(r, r, r, 1.0);;\n"
+ "}\n";
+
+
+static struct uniform_info Uniforms[] = {
+ { "pParam", 1, GL_FLOAT_VEC4, { 17*17, 3, 2, 3 }, -1 },
+ { "Slice", 1, GL_FLOAT, { 0.5, 0, 0, 0}, -1 },
+ END_OF_UNIFORMS
+};
+
+/* program/shader objects */
+static GLuint fragShader;
+static GLuint vertShader;
+static GLuint program;
+
+static GLint win = 0;
+static GLfloat xRot = 0.0f, yRot = 0.0f, zRot = 0.0f;
+static GLfloat Slice = 0.0;
+static GLboolean Anim = GL_TRUE;
+static GLint ParamUniform = -1, SliceUniform = -1;
+
+
+static void
+Idle(void)
+{
+ Slice = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ glutPostRedisplay();
+}
+
+
+static void
+Redisplay(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUniform1f(SliceUniform, Slice);
+
+ glPushMatrix();
+ glRotatef(xRot, 1.0f, 0.0f, 0.0f);
+ glRotatef(yRot, 0.0f, 1.0f, 0.0f);
+ glRotatef(zRot, 0.0f, 0.0f, 1.0f);
+
+ glBegin(GL_POLYGON);
+ glTexCoord2f(0, 0); glVertex2f(-2, -2);
+ glTexCoord2f(1, 0); glVertex2f( 2, -2);
+ glTexCoord2f(1, 1); glVertex2f( 2, 2);
+ glTexCoord2f(0, 1); glVertex2f(-2, 2);
+ glEnd();
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void
+Reshape(int width, int height)
+{
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0f, 0.0f, -15.0f);
+}
+
+
+static void
+CleanUp(void)
+{
+ glDeleteShader(fragShader);
+ glDeleteShader(vertShader);
+ glDeleteProgram(program);
+ glutDestroyWindow(win);
+}
+
+
+static void
+Key(unsigned char key, int x, int y)
+{
+ const GLfloat step = 1.0;//0.01;
+ (void) x;
+ (void) y;
+
+ switch(key) {
+ case 'a':
+ Anim = !Anim;
+ glutIdleFunc(Anim ? Idle : NULL);
+ break;
+ case 's':
+ Slice -= step;
+ break;
+ case 'S':
+ Slice += step;
+ break;
+ case 'z':
+ zRot -= 1.0;
+ break;
+ case 'Z':
+ zRot += 1.0;
+ break;
+ case 27:
+ CleanUp();
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+SpecialKey(int key, int x, int y)
+{
+ const GLfloat step = 3.0f;
+
+ (void) x;
+ (void) y;
+
+ switch(key) {
+ case GLUT_KEY_UP:
+ xRot -= step;
+ break;
+ case GLUT_KEY_DOWN:
+ xRot += step;
+ break;
+ case GLUT_KEY_LEFT:
+ yRot -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ yRot += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+
+static void
+Init(void)
+{
+ const char *filename = "simplex-noise.glsl";
+ char noiseText[10000];
+ FILE *f;
+ int len;
+
+ f = fopen(filename, "r");
+ if (!f) {
+ fprintf(stderr, "Unable to open %s\n", filename);
+ exit(1);
+ }
+
+ len = fread(noiseText, 1, sizeof(noiseText), f);
+ fclose(f);
+
+ /* append main() code onto buffer */
+ strcpy(noiseText + len, FragShaderMainText);
+
+ if (!ShadersSupported())
+ exit(1);
+
+ vertShader = CompileShaderText(GL_VERTEX_SHADER, VertShaderText);
+ fragShader = CompileShaderText(GL_FRAGMENT_SHADER, noiseText);
+ program = LinkShaders(vertShader, fragShader);
+
+ glUseProgram(program);
+
+ ParamUniform = glGetUniformLocation(program, "pParam");
+ SliceUniform = glGetUniformLocation(program, "Slice");
+
+ SetUniformValues(program, Uniforms);
+ PrintUniforms(Uniforms);
+
+ assert(glGetError() == 0);
+
+ glClearColor(0.4f, 0.4f, 0.8f, 0.0f);
+
+ printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
+
+ assert(glIsProgram(program));
+ assert(glIsShader(fragShader));
+ assert(glIsShader(vertShader));
+
+ glColor3f(1, 0, 0);
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitWindowSize(400, 400);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+ win = glutCreateWindow(argv[0]);
+ glewInit();
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(SpecialKey);
+ glutDisplayFunc(Redisplay);
+ glutIdleFunc(Anim ? Idle : NULL);
+ Init();
+ glutMainLoop();
+ return 0;
+}
+
More information about the mesa-commit
mailing list