summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2008-12-17 13:58:31 -0700
committerBrian Paul <brian.paul@tungstengraphics.com>2008-12-17 13:58:31 -0700
commit1cb680d06bf4c7a6789ecf8e949271e0b6d8bbf2 (patch)
tree359d618efa33357d1e4cb1532a6fcdac0c503bed
parent637f06dcdc2e5b29cbc39445b7141e6a496e1585 (diff)
demos: add test of vertex-only and fragment-only shader programs
-rw-r--r--progs/glsl/Makefile9
-rw-r--r--progs/glsl/vert-or-frag-only.c191
2 files changed, 200 insertions, 0 deletions
diff --git a/progs/glsl/Makefile b/progs/glsl/Makefile
index 856de91c90..a944abe908 100644
--- a/progs/glsl/Makefile
+++ b/progs/glsl/Makefile
@@ -27,6 +27,7 @@ PROGS = \
toyball \
twoside \
trirast \
+ vert-or-frag-only \
vert-tex
@@ -186,6 +187,14 @@ trirast: trirast.o shaderutil.o
$(CC) -I$(INCDIR) $(CFLAGS) $(LDFLAGS) trirast.o shaderutil.o $(LIBS) -o $@
+vert-or-frag-only.o: vert-or-frag-only.c extfuncs.h shaderutil.h
+ $(CC) -c -I$(INCDIR) $(CFLAGS) vert-or-frag-only.c
+
+vert-or-frag-only: vert-or-frag-only.o shaderutil.o
+ $(CC) -I$(INCDIR) $(CFLAGS) $(LDFLAGS) vert-or-frag-only.o shaderutil.o $(LIBS) -o $@
+
+
+
vert-tex.o: vert-tex.c extfuncs.h shaderutil.h
$(CC) -c -I$(INCDIR) $(CFLAGS) vert-tex.c
diff --git a/progs/glsl/vert-or-frag-only.c b/progs/glsl/vert-or-frag-only.c
new file mode 100644
index 0000000000..f6eedd8327
--- /dev/null
+++ b/progs/glsl/vert-or-frag-only.c
@@ -0,0 +1,191 @@
+/**
+ * Draw two quads, one using only a vertex shader, the other only with a
+ * fragment shader. They should appear the same.
+ * 17 Dec 2008
+ * Brian Paul
+ */
+
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/gl.h>
+#include <GL/glut.h>
+#include <GL/glext.h>
+#include "extfuncs.h"
+#include "shaderutil.h"
+
+
+static char *FragProgFile = NULL;
+static char *VertProgFile = NULL;
+static GLuint FragShader;
+static GLuint VertShader;
+static GLuint VertProgram; /* w/out vertex shader */
+static GLuint FragProgram; /* w/out fragment shader */
+static GLint Win = 0;
+
+
+static void
+DrawQuadColor(void)
+{
+ glBegin(GL_QUADS);
+ glColor3f(1, 0, 0); glVertex2f(-1, -1);
+ glColor3f(0, 1, 0); glVertex2f( 1, -1);
+ glColor3f(0, 0, 1); glVertex2f( 1, 1);
+ glColor3f(1, 0, 1); glVertex2f(-1, 1);
+ glEnd();
+}
+
+
+/** as above, but specify color via texcoords */
+static void
+DrawQuadTex(void)
+{
+ glBegin(GL_QUADS);
+ glTexCoord3f(1, 0, 0); glVertex2f(-1, -1);
+ glTexCoord3f(0, 1, 0); glVertex2f( 1, -1);
+ glTexCoord3f(0, 0, 1); glVertex2f( 1, 1);
+ glTexCoord3f(1, 0, 1); glVertex2f(-1, 1);
+ glEnd();
+}
+
+
+static void
+Redisplay(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* render with vertex shader only */
+ glUseProgram_func(VertProgram);
+ glPushMatrix();
+ glTranslatef(-1.5, 0, 0);
+ DrawQuadTex();
+ glPopMatrix();
+
+ /* render with fragment shader only */
+ glUseProgram_func(FragProgram);
+ glPushMatrix();
+ glTranslatef(+1.5, 0, 0);
+ DrawQuadColor();
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void
+Reshape(int width, int height)
+{
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-4, 4, -2, 2, -1, 1);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+static void
+CleanUp(void)
+{
+ glDeleteShader_func(FragShader);
+ glDeleteShader_func(VertShader);
+ glDeleteProgram_func(VertProgram);
+ glDeleteProgram_func(FragProgram);
+ glutDestroyWindow(Win);
+}
+
+
+static void
+Key(unsigned char key, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch(key) {
+ case 27:
+ CleanUp();
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+Init(void)
+{
+ static const char *fragShaderText =
+ "void main() {\n"
+ " gl_FragColor = gl_Color;\n"
+ "}\n";
+ static const char *vertShaderText =
+ "void main() {\n"
+ " gl_Position = ftransform();\n"
+ " gl_FrontColor = gl_MultiTexCoord0;\n" /* see DrawQuadTex() */
+ "}\n";
+
+ if (!ShadersSupported())
+ exit(1);
+
+ GetExtensionFuncs();
+
+ if (FragProgFile)
+ FragShader = CompileShaderFile(GL_FRAGMENT_SHADER, FragProgFile);
+ else
+ FragShader = CompileShaderText(GL_FRAGMENT_SHADER, fragShaderText);
+
+ if (VertProgFile)
+ VertShader = CompileShaderFile(GL_VERTEX_SHADER, VertProgFile);
+ else
+ VertShader = CompileShaderText(GL_VERTEX_SHADER, vertShaderText);
+
+ VertProgram = LinkShaders(VertShader, 0);
+ FragProgram = LinkShaders(0, FragShader);
+
+ glClearColor(0.3f, 0.3f, 0.3f, 0.0f);
+ glEnable(GL_DEPTH_TEST);
+
+ printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER));
+
+ assert(glIsProgram_func(VertProgram));
+ assert(glIsProgram_func(FragProgram));
+ assert(glIsShader_func(FragShader));
+ assert(glIsShader_func(VertShader));
+
+ glColor3f(1, 0, 0);
+}
+
+
+static void
+ParseOptions(int argc, char *argv[])
+{
+ int i;
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-fs") == 0) {
+ FragProgFile = argv[i+1];
+ }
+ else if (strcmp(argv[i], "-vs") == 0) {
+ VertProgFile = argv[i+1];
+ }
+ }
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitWindowPosition( 0, 0);
+ glutInitWindowSize(400, 200);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+ Win = glutCreateWindow(argv[0]);
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Redisplay);
+ ParseOptions(argc, argv);
+ Init();
+ glutMainLoop();
+ return 0;
+}