From 8ac9945afac6a2377e4b9e9d7377e33be8326507 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Mon, 14 Feb 2011 01:26:43 +0000 Subject: [PATCH] Shader tests. Disabled for now. --- src/scene.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/scene.cpp b/src/scene.cpp index db51c0fe..13832bd8 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -13,6 +13,7 @@ #endif #include +#include #include #ifdef WIN32 @@ -28,6 +29,9 @@ #include "core.h" +#define ATTRIB_POSITION 42 /* arbitrary id */ +#define SHADER_CRAP 0 + struct Tile { uint32_t prio, code; @@ -55,6 +59,10 @@ private: int ntiles; float angle; +#if SHADER_CRAP + GLuint prog, sh1, sh2; + GLint uni_mvp, uni_color; +#endif GLuint *bufs; int nbufs; @@ -63,6 +71,25 @@ private: Scene *SceneData::scene = NULL; +#if SHADER_CRAP +static char const *vertexshader = + "attribute vec4 position;\n" + "uniform mat4 mvp;\n" + "\n" + "void main()\n" + "{\n" + "    gl_Position = mvp * position;\n" + "}\n"; + +static char const *fragmentshader = + "uniform lowp vec4 color;\n" + "\n" + "void main()\n" + "{\n" + " gl_FragColor = color;\n" + "}\n"; +#endif + /* * Public Scene class */ @@ -76,12 +103,47 @@ Scene::Scene(float angle) data->bufs = 0; data->nbufs = 0; + +#if SHADER_CRAP + data->sh1 = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(data->sh1, 1, &vertexshader, NULL); + glCompileShader(data->sh1); + + char buf[4096]; + GLsizei dummy; + glGetShaderInfoLog(data->sh1, 4096, &dummy, buf); + fprintf(stderr, "sh1 %i: %s", data->sh1, buf); + + data->sh2 = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(data->sh2, 1, &fragmentshader, NULL); + glCompileShader(data->sh2); + + glGetShaderInfoLog(data->sh2, 4096, &dummy, buf); + fprintf(stderr, "sh2 %i: %s", data->sh2, buf); + + data->prog = glCreateProgram(); + glAttachShader(data->prog, data->sh1); + glAttachShader(data->prog, data->sh2); + + glBindAttribLocation(data->prog, ATTRIB_POSITION, "position"); + glLinkProgram(data->prog); + + data->uni_mvp = glGetUniformLocation(data->prog, "mvp"); + data->uni_color = glGetUniformLocation(data->prog, "color"); +#endif } Scene::~Scene() { /* FIXME: this must be done while the GL context is still active. * Change the architecture to make sure of that. */ +#if SHADER_CRAP + glDetachShader(data->prog, data->sh1); + glDetachShader(data->prog, data->sh2); + glDeleteShader(data->sh1); + glDeleteShader(data->sh2); + glDeleteProgram(data->prog); +#endif glDeleteBuffers(data->nbufs, data->bufs); delete data; } @@ -170,11 +232,22 @@ void Scene::Render() // XXX: rename to Blit() glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); +#if SHADER_CRAP + glUseProgram(data->prog); + float4x4 mvp = float4x4::identity(); + mvp = mvp - mvp; + glUniformMatrix4fv(data->uni_mvp, 1, GL_FALSE, (GLfloat *)&mvp[0][0]); + glUniform4f(data->uni_color, 1.0f, 0.0f, 1.0f, 1.0f); +#endif glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]); glBufferData(GL_ARRAY_BUFFER, 6 * 3 * (n - i) * sizeof(float), vertex, GL_DYNAMIC_DRAW); glVertexPointer(3, GL_FLOAT, 0, NULL); +#if SHADER_CRAP + glVertexAttribPointer(ATTRIB_POSITION, (n - i) * 6, GL_FLOAT, false, 0, vertex); + glEnableVertexAttribArray(ATTRIB_POSITION); +#endif glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]); glBufferData(GL_ARRAY_BUFFER, 6 * 2 * (n - i) * sizeof(float),