| @@ -28,11 +28,13 @@ namespace lol | |||||
| * DebugQuad implementation class | * DebugQuad implementation class | ||||
| */ | */ | ||||
| #define NUM_ARRAYS 2 | |||||
| #define NUM_BUFFERS 6 | |||||
| #define NUM_ATTRS 6 | |||||
| #define NUM_SHADERS 6 | |||||
| #define NUM_TEXTURES 1 | |||||
| static int const NUM_ARRAYS = 2; | |||||
| static int const NUM_BUFFERS = 6; | |||||
| static int const NUM_ATTRS = 6; | |||||
| static int const NUM_SHADERS = 6; | |||||
| static int const NUM_TEXTURES = 1; | |||||
| static int const TEX_SIZE = 32; | |||||
| class DebugQuadData | class DebugQuadData | ||||
| { | { | ||||
| @@ -48,7 +50,7 @@ private: | |||||
| Shader *shader[NUM_SHADERS]; | Shader *shader[NUM_SHADERS]; | ||||
| GLuint attr[NUM_ATTRS]; | GLuint attr[NUM_ATTRS]; | ||||
| GLuint texture[NUM_TEXTURES]; | GLuint texture[NUM_TEXTURES]; | ||||
| uint8_t image[1][32 * 32 * 4]; | |||||
| uint8_t image[1][TEX_SIZE * TEX_SIZE * 4]; | |||||
| }; | }; | ||||
| /* | /* | ||||
| @@ -79,289 +81,44 @@ void DebugQuad::TickDraw(float deltams) | |||||
| { | { | ||||
| glGenVertexArrays(NUM_ARRAYS, data->array); | glGenVertexArrays(NUM_ARRAYS, data->array); | ||||
| glGenBuffers(NUM_BUFFERS, data->buffer); | glGenBuffers(NUM_BUFFERS, data->buffer); | ||||
| #if 0 | |||||
| static char const *vertexshader = | |||||
| "//#version 130\n" | |||||
| "varying vec2 in_Position;\n" | |||||
| "varying vec4 in_Color;\n" | |||||
| "varying vec2 in_TexCoord;\n" | |||||
| "varying vec4 pass_Color;\n" | |||||
| "void main()\n" | |||||
| "{\n" | |||||
| "gl_TexCoord[0] = gl_MultiTexCoord0;\n" | |||||
| " gl_Position = vec4(in_Position, 0.0f, 1.0f);\n" | |||||
| " gl_TexCoord[0] = vec4(in_TexCoord, 0.0, 0.0);\n" | |||||
| " pass_Color = in_Color;\n" | |||||
| "}\n"; | |||||
| static char const *fragmentshader = | |||||
| "//#version 130\n" | |||||
| "varying vec4 pass_Color;\n" | |||||
| "uniform sampler2D in_Texture;\n" | |||||
| "void main()\n" | |||||
| "{\n" | |||||
| " vec4 col = pass_Color;\n" | |||||
| " vec4 tex = texture2D(in_Texture, vec2(gl_TexCoord[0]));\n" | |||||
| " gl_FragColor = col * tex;\n" | |||||
| " gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);\n" | |||||
| "}\n"; | |||||
| data->shader[0] = Shader::Create(vertexshader, fragmentshader); | |||||
| glGenTextures(1, data->texture); | |||||
| #endif | |||||
| glGenTextures(NUM_TEXTURES, data->texture); | |||||
| for (int i = 0; i < NUM_SHADERS; i++) | |||||
| data->shader[i] = NULL; | |||||
| /* Checkerboard texture */ | /* Checkerboard texture */ | ||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | glBindTexture(GL_TEXTURE_2D, data->texture[0]); | ||||
| for (int j = 0; j < 32; j++) | |||||
| for (int i = 0; i < 32; i++) | |||||
| for (int j = 0; j < TEX_SIZE; j++) | |||||
| for (int i = 0; i < TEX_SIZE; i++) | |||||
| { | { | ||||
| uint8_t wb = (((i / 2) ^ (j / 2)) & 1) * 0xff; | uint8_t wb = (((i / 2) ^ (j / 2)) & 1) * 0xff; | ||||
| data->image[0][(j * 32 + i) * 4 + 0] = wb; | |||||
| data->image[0][(j * 32 + i) * 4 + 1] = wb; | |||||
| data->image[0][(j * 32 + i) * 4 + 2] = wb; | |||||
| data->image[0][(j * 32 + i) * 4 + 3] = 0xff; | |||||
| data->image[0][(j * TEX_SIZE + i) * 4 + 0] = wb; | |||||
| data->image[0][(j * TEX_SIZE + i) * 4 + 1] = wb; | |||||
| data->image[0][(j * TEX_SIZE + i) * 4 + 2] = wb; | |||||
| data->image[0][(j * TEX_SIZE + i) * 4 + 3] = 0xff; | |||||
| } | } | ||||
| /* Use GL_RGBA instead of 4 for the internal format (Android) */ | /* Use GL_RGBA instead of 4 for the internal format (Android) */ | ||||
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, | |||||
| glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0, | |||||
| GL_RGBA, GL_UNSIGNED_BYTE, data->image[0]); | GL_RGBA, GL_UNSIGNED_BYTE, data->image[0]); | ||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | ||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | ||||
| /* Quad #4: create texture in 1.10 fragment shader */ | |||||
| data->shader[0] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);" | |||||
| " float dy = mod(gl_FragCoord.x * 0.125, 1.0);" | |||||
| " float dz = mod(gl_FragCoord.y * 0.125, 1.0);" | |||||
| " gl_FragColor = vec4(dx, dy, dz, 1.0);" | |||||
| "}"); | |||||
| /* Quad #5: pass color from 1.10 vertex shader to fragment shader */ | |||||
| data->shader[1] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " float r = gl_MultiTexCoord0.x;" | |||||
| " float g = gl_MultiTexCoord0.y;" | |||||
| " pass_Color = vec4(1.0 - r, 1.0 - g, r, 1.0);" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_FragColor = pass_Color;" | |||||
| "}"); | |||||
| /* Quad #6: apply texture in 1.10 fragment shader */ | |||||
| data->shader[2] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_FragColor = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| "}"); | |||||
| /* Quad #8: vertex buffer, apply texture in 1.10 fragment shader */ | |||||
| data->shader[3] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||||
| " pass_Color = gl_Color;" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| /* Quad #9: vertex buffer, apply texture and color in 1.20 shader */ | |||||
| data->shader[4] = Shader::Create( | |||||
| "#version 120\n" | |||||
| "attribute vec3 in_Vertex;" | |||||
| "attribute vec3 in_Color;" | |||||
| "attribute vec2 in_MultiTexCoord0;" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | |||||
| " pass_Color = vec4(in_Color, 1.0);" | |||||
| " gl_Position = vec4(in_Vertex, 1.0);" | |||||
| "}", | |||||
| "#version 120\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| data->attr[0] = data->shader[4]->GetAttribLocation("in_Vertex"); | |||||
| data->attr[1] = data->shader[4]->GetAttribLocation("in_Color"); | |||||
| data->attr[2] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0"); | |||||
| /* Quad #10: vertex buffer, apply texture and color in 1.30 shader */ | |||||
| data->shader[5] = Shader::Create( | |||||
| "#version 130\n" | |||||
| "in vec3 in_Vertex;" | |||||
| "in vec3 in_Color;" | |||||
| "in vec2 in_MultiTexCoord0;" | |||||
| "out vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | |||||
| " pass_Color = vec4(in_Color, 1.0);" | |||||
| " gl_Position = vec4(in_Vertex, 1.0);" | |||||
| "}", | |||||
| "#version 130\n" | |||||
| "in vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| data->attr[3] = data->shader[4]->GetAttribLocation("in_Vertex"); | |||||
| data->attr[4] = data->shader[4]->GetAttribLocation("in_Color"); | |||||
| data->attr[5] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0"); | |||||
| data->initialised = 1; | data->initialised = 1; | ||||
| } | } | ||||
| else if (data->initialised && IsDestroying()) | else if (data->initialised && IsDestroying()) | ||||
| { | { | ||||
| glDeleteVertexArrays(NUM_ARRAYS, data->array); | glDeleteVertexArrays(NUM_ARRAYS, data->array); | ||||
| glDeleteBuffers(NUM_BUFFERS, data->buffer); | glDeleteBuffers(NUM_BUFFERS, data->buffer); | ||||
| Shader::Destroy(data->shader[0]); | |||||
| Shader::Destroy(data->shader[1]); | |||||
| Shader::Destroy(data->shader[2]); | |||||
| Shader::Destroy(data->shader[3]); | |||||
| glDeleteTextures(NUM_TEXTURES, data->texture); | glDeleteTextures(NUM_TEXTURES, data->texture); | ||||
| for (int i = 0; i < NUM_SHADERS; i++) | |||||
| if (data->shader[i]) | |||||
| Shader::Destroy(data->shader[i]); | |||||
| data->initialised = 0; | data->initialised = 0; | ||||
| } | } | ||||
| #if 0 | |||||
| float const st = sinf(0.0005f * data->time); | |||||
| float const ct = cosf(0.0005f * data->time); | |||||
| GLfloat const verts[6][2] = | |||||
| { | |||||
| { -0.7f * (st + ct), 0.7f * (st - ct) }, | |||||
| { 0.7f * (st - ct), 0.7f * (st + ct) }, | |||||
| { -0.7f * (st - ct), -0.7f * (st + ct) }, | |||||
| { -0.7f * (st - ct), -0.7f * (st + ct) }, | |||||
| { 0.7f * (st - ct), 0.7f * (st + ct) }, | |||||
| { 0.7f * (st + ct), -0.7f * (st - ct) }, | |||||
| }; | |||||
| /* Using only 3 components breaks on Android for some reason. */ | |||||
| static GLfloat const cols[6][4] = | |||||
| { | |||||
| { 1.0f, 0.2f, 0.2f, 1.0f }, | |||||
| { 0.2f, 0.2f, 1.0f, 1.0f }, | |||||
| { 1.0f, 1.0f, 0.2f, 1.0f }, | |||||
| { 1.0f, 1.0f, 0.2f, 1.0f }, | |||||
| { 0.2f, 0.2f, 1.0f, 1.0f }, | |||||
| { 0.2f, 1.0f, 0.2f, 1.0f }, | |||||
| }; | |||||
| static GLfloat const tcs[6][2] = | |||||
| { | |||||
| { 0.0f, 1.0f }, { 1.0f, 1.0f }, { 0.0f, 0.0f }, | |||||
| { 0.0f, 0.0f }, { 1.0f, 1.0f }, { 1.0f, 0.0f }, | |||||
| }; | |||||
| #if defined __CELLOS_LV2__ | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | |||||
| glEnableClientState(GL_COLOR_ARRAY); | |||||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |||||
| glActiveTexture(GL_TEXTURE0); | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); | |||||
| glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); | |||||
| glVertexPointer(2, GL_FLOAT, GL_FALSE, 0); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[1]); | |||||
| glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(GLfloat), cols, GL_STATIC_DRAW); | |||||
| glColorPointer(4, GL_FLOAT, GL_FALSE, 0); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[2]); | |||||
| glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tcs, GL_STATIC_DRAW); | |||||
| glTexCoordPointer(2, GL_FLOAT, GL_FALSE, 0); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | |||||
| glDisableClientState(GL_COLOR_ARRAY); | |||||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |||||
| #else | |||||
| data->shader[0]->Bind(); | |||||
| GLuint attr_pos, attr_col, attr_tex; | |||||
| attr_pos = data->shader[0]->GetAttribLocation("in_Position"); | |||||
| attr_col = data->shader[0]->GetAttribLocation("in_Color"); | |||||
| attr_tex = data->shader[0]->GetAttribLocation("in_TexCoord"); | |||||
| glEnableVertexAttribArray(attr_pos); | |||||
| glEnableVertexAttribArray(attr_col); | |||||
| glEnableVertexAttribArray(attr_tex); | |||||
| /* Bind texture */ | |||||
| glActiveTexture(GL_TEXTURE0); | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); | |||||
| glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); | |||||
| glVertexAttribPointer(attr_pos, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[1]); | |||||
| glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(GLfloat), cols, GL_STATIC_DRAW); | |||||
| glVertexAttribPointer(attr_col, 4, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[2]); | |||||
| glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tcs, GL_STATIC_DRAW); | |||||
| glVertexAttribPointer(attr_tex, 2, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||||
| glDisableVertexAttribArray(attr_pos); | |||||
| glDisableVertexAttribArray(attr_col); | |||||
| glDisableVertexAttribArray(attr_tex); | |||||
| #endif | |||||
| #endif | |||||
| /* Reset GL states */ | |||||
| /* Reset GL states to something reasonably safe */ | |||||
| glMatrixMode(GL_PROJECTION); | glMatrixMode(GL_PROJECTION); | ||||
| glLoadIdentity(); | glLoadIdentity(); | ||||
| glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
| @@ -388,8 +145,11 @@ void DebugQuad::TickDraw(float deltams) | |||||
| GLfloat const texcoords[] = { f1, f3, f3, f2, f2, f4, | GLfloat const texcoords[] = { f1, f3, f3, f2, f2, f4, | ||||
| f2, f4, f4, f1, f1, f3 }; | f2, f4, f4, f1, f1, f3 }; | ||||
| #if defined HAVE_GLBEGIN | |||||
| /* Quad #1: simple glBegin program */ | |||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| /* | |||||
| * Test #1: simple glBegin code | |||||
| * Renders an orange square. | |||||
| */ | |||||
| glColor3f(0.8f, 0.5f, 0.2f); | glColor3f(0.8f, 0.5f, 0.2f); | ||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| @@ -403,7 +163,10 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #2: glBegin program with varying color */ | |||||
| /* | |||||
| * Test #2: glBegin + per-vertex coloring | |||||
| * Renders a multicolored square with varying colors. | |||||
| */ | |||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| glColor3f(f1, f2, f3); | glColor3f(f1, f2, f3); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| @@ -421,7 +184,10 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #3: textured quad */ | |||||
| /* | |||||
| * Test #3: glBegin + texture | |||||
| * Renders an animated black-and-white distorted checkerboard. | |||||
| */ | |||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | glBindTexture(GL_TEXTURE_2D, data->texture[0]); | ||||
| glColor3f(1.0f, 1.0f, 1.0f); | glColor3f(1.0f, 1.0f, 1.0f); | ||||
| @@ -444,7 +210,26 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #4: set color in fragment shader */ | |||||
| /* | |||||
| * Test #4: glBegin + color in fragment shader | |||||
| * Renders a static, coloured and tiled pattern. | |||||
| */ | |||||
| if (!data->shader[0]) | |||||
| data->shader[0] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);" | |||||
| " float dy = mod(gl_FragCoord.x * 0.125, 1.0);" | |||||
| " float dz = mod(gl_FragCoord.y * 0.125, 1.0);" | |||||
| " gl_FragColor = vec4(dx, dy, dz, 1.0);" | |||||
| "}"); | |||||
| data->shader[0]->Bind(); | data->shader[0]->Bind(); | ||||
| glColor3f(0.0f, 1.0f, 1.0f); | glColor3f(0.0f, 1.0f, 1.0f); | ||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| @@ -460,7 +245,28 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #5: pass color from vertex shader to fragment shader */ | |||||
| /* | |||||
| * Test #5: glBegin + pass color from vertex shader to fragment shader | |||||
| * Renders a multicolored square with varying colors. | |||||
| */ | |||||
| if (!data->shader[1]) | |||||
| data->shader[1] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " float r = gl_MultiTexCoord0.x;" | |||||
| " float g = gl_MultiTexCoord0.y;" | |||||
| " pass_Color = vec4(1.0 - r, 1.0 - g, r, 1.0);" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_FragColor = pass_Color;" | |||||
| "}"); | |||||
| data->shader[1]->Bind(); | data->shader[1]->Bind(); | ||||
| glColor3f(0.0f, 1.0f, 1.0f); | glColor3f(0.0f, 1.0f, 1.0f); | ||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| @@ -482,7 +288,26 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #6: apply texture in fragment shader */ | |||||
| /* | |||||
| * Test #6: glBegin + apply texture in fragment shader | |||||
| * Renders an animated black-and-white distorted checkerboard with a | |||||
| * zoom ratio twice the one in test #3. | |||||
| */ | |||||
| if (!data->shader[2]) | |||||
| data->shader[2] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_FragColor = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| "}"); | |||||
| data->shader[2]->Bind(); | data->shader[2]->Bind(); | ||||
| glColor3f(0.0f, 1.0f, 1.0f); | glColor3f(0.0f, 1.0f, 1.0f); | ||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| @@ -508,7 +333,10 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| #endif | #endif | ||||
| /* Quad #7: simple vertex buffer, no shader */ | |||||
| /* | |||||
| * Test #7: vertex buffer | |||||
| * Renders a multicolored square with varying colors. | |||||
| */ | |||||
| GLfloat const vertices1[] = { data->aa.x, data->bb.y, 0.0f, | GLfloat const vertices1[] = { data->aa.x, data->bb.y, 0.0f, | ||||
| data->bb.x, data->bb.y, 0.0f, | data->bb.x, data->bb.y, 0.0f, | ||||
| data->bb.x, data->aa.y, 0.0f, | data->bb.x, data->aa.y, 0.0f, | ||||
| @@ -529,7 +357,31 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #8: vertex buffer, apply texture and color in fragment shader */ | |||||
| /* | |||||
| * Test #8: vertex buffer + texture & color in 1.10 fragment shader | |||||
| * Renders a multicolored square with varying colors xored with an | |||||
| * animated distorted checkerboard. | |||||
| */ | |||||
| if (!data->shader[3]) | |||||
| data->shader[3] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||||
| " pass_Color = gl_Color;" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| data->shader[3]->Bind(); | data->shader[3]->Bind(); | ||||
| GLfloat const vertices2[] = { data->aa.x, data->bb.y, 0.0f, | GLfloat const vertices2[] = { data->aa.x, data->bb.y, 0.0f, | ||||
| data->bb.x, data->bb.y, 0.0f, | data->bb.x, data->bb.y, 0.0f, | ||||
| @@ -554,7 +406,38 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #9: vertex buffer, apply texture and color in 1.20 shader */ | |||||
| /* | |||||
| * Test #8: vertex buffer + texture & color in 1.20 fragment shader | |||||
| * Renders a multicolored square with varying colors xored with an | |||||
| * animated distorted checkerboard. | |||||
| */ | |||||
| if (!data->shader[4]) | |||||
| { | |||||
| data->shader[4] = Shader::Create( | |||||
| "#version 120\n" | |||||
| "attribute vec3 in_Vertex;" | |||||
| "attribute vec3 in_Color;" | |||||
| "attribute vec2 in_MultiTexCoord0;" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | |||||
| " pass_Color = vec4(in_Color, 1.0);" | |||||
| " gl_Position = vec4(in_Vertex, 1.0);" | |||||
| "}", | |||||
| "#version 120\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| data->attr[0] = data->shader[4]->GetAttribLocation("in_Vertex"); | |||||
| data->attr[1] = data->shader[4]->GetAttribLocation("in_Color"); | |||||
| data->attr[2] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0"); | |||||
| } | |||||
| data->shader[4]->Bind(); | data->shader[4]->Bind(); | ||||
| GLfloat const vertices3[] = { data->aa.x, data->bb.y, 0.0f, | GLfloat const vertices3[] = { data->aa.x, data->bb.y, 0.0f, | ||||
| data->bb.x, data->bb.y, 0.0f, | data->bb.x, data->bb.y, 0.0f, | ||||
| @@ -593,7 +476,38 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #10: vertex buffer, apply texture and color in 1.30 shader */ | |||||
| /* | |||||
| * Test #8: vertex buffer + texture & color in 1.30 fragment shader | |||||
| * Renders a multicolored square with varying colors xored with an | |||||
| * animated distorted checkerboard. | |||||
| */ | |||||
| if (!data->shader[5]) | |||||
| { | |||||
| data->shader[5] = Shader::Create( | |||||
| "#version 130\n" | |||||
| "in vec3 in_Vertex;" | |||||
| "in vec3 in_Color;" | |||||
| "in vec2 in_MultiTexCoord0;" | |||||
| "out vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | |||||
| " pass_Color = vec4(in_Color, 1.0);" | |||||
| " gl_Position = vec4(in_Vertex, 1.0);" | |||||
| "}", | |||||
| "#version 130\n" | |||||
| "in vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| data->attr[3] = data->shader[4]->GetAttribLocation("in_Vertex"); | |||||
| data->attr[4] = data->shader[4]->GetAttribLocation("in_Color"); | |||||
| data->attr[5] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0"); | |||||
| } | |||||
| data->shader[5]->Bind(); | data->shader[5]->Bind(); | ||||
| GLfloat const vertices4[] = { data->aa.x, data->bb.y, 0.0f, | GLfloat const vertices4[] = { data->aa.x, data->bb.y, 0.0f, | ||||
| data->bb.x, data->bb.y, 0.0f, | data->bb.x, data->bb.y, 0.0f, | ||||