Sfoglia il codice sorgente

debug: add GLSL 1.20 and 1.30 shaders to the debug quad.

legacy
Sam Hocevar sam 13 anni fa
parent
commit
0f143850e0
1 ha cambiato i file con 172 aggiunte e 43 eliminazioni
  1. +172
    -43
      src/debugquad.cpp

+ 172
- 43
src/debugquad.cpp Vedi File

@@ -28,7 +28,11 @@ namespace lol
* DebugQuad implementation class
*/

#define NUM_SHADERS 4
#define NUM_ARRAYS 2
#define NUM_BUFFERS 6
#define NUM_ATTRS 6
#define NUM_SHADERS 6
#define NUM_TEXTURES 1

class DebugQuadData
{
@@ -39,9 +43,11 @@ private:

int initialised;
float time;
GLuint buflist[3];
GLuint array[NUM_ARRAYS];
GLuint buffer[NUM_BUFFERS];
Shader *shader[NUM_SHADERS];
GLuint texlist[1];
GLuint attr[NUM_ATTRS];
GLuint texture[NUM_TEXTURES];
uint8_t image[1][32 * 32 * 4];
};

@@ -71,8 +77,9 @@ void DebugQuad::TickDraw(float deltams)

if (!data->initialised && !IsDestroying())
{
glGenVertexArrays(NUM_ARRAYS, data->array);
glGenBuffers(NUM_BUFFERS, data->buffer);
#if 0
glGenBuffers(3, data->buflist);

static char const *vertexshader =
"//#version 130\n"
@@ -99,12 +106,12 @@ void DebugQuad::TickDraw(float deltams)
" gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);\n"
"}\n";
data->shader[0] = Shader::Create(vertexshader, fragmentshader);
glGenTextures(1, data->texlist);
glGenTextures(1, data->texture);
#endif

/* Checkerboard texture */
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, data->texlist[0]);
glBindTexture(GL_TEXTURE_2D, data->texture[0]);
for (int j = 0; j < 32; j++)
for (int i = 0; i < 32; i++)
{
@@ -120,16 +127,15 @@ void DebugQuad::TickDraw(float deltams)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

/* Quad #4: create texture in fragment shader */
/* Quad #4: create texture in 1.10 fragment shader */
data->shader[0] = Shader::Create(
"#version 130\n"
"in vec2 in_Vertex;"
"#version 110\n"
"void main()"
"{"
" gl_Position = vec4(in_Vertex, 0.0, 1.0);"
" gl_Position = gl_Vertex;"
"}",

"#version 130\n"
"#version 110\n"
"void main()"
"{"
" float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);"
@@ -138,60 +144,76 @@ void DebugQuad::TickDraw(float deltams)
" gl_FragColor = vec4(dx, dy, dz, 1.0);"
"}");

/* Quad #5: pass color from vertex shader to fragment shader */
/* Quad #5: pass color from 1.10 vertex shader to fragment shader */
data->shader[1] = Shader::Create(
"#version 130\n"
"in vec2 in_Vertex;"
"in vec2 in_MultiTexCoord0;"
"#version 110\n"
"varying vec4 pass_Color;"
"void main()"
"{"
" float r = in_MultiTexCoord0.x;"
" float g = in_MultiTexCoord0.y;"
" float r = gl_MultiTexCoord0.x;"
" float g = gl_MultiTexCoord0.y;"
" pass_Color = vec4(1.0 - r, 1.0 - g, r, 1.0);"
" gl_Position = vec4(in_Vertex, 0.0, 1.0);"
" gl_Position = gl_Vertex;"
"}",

"#version 130\n"
"#version 110\n"
"varying vec4 pass_Color;"
"void main()"
"{"
" gl_FragColor = pass_Color;"
"}");

/* Quad #6: apply texture in fragment shader */
/* Quad #6: apply texture in 1.10 fragment shader */
data->shader[2] = Shader::Create(
"#version 130\n"
"in vec2 in_Vertex;"
"in vec2 in_MultiTexCoord0;"
"#version 110\n"
"void main()"
"{"
" gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);"
" gl_Position = vec4(in_Vertex, 0.0, 1.0);"
" gl_TexCoord[0] = gl_MultiTexCoord0;"
" gl_Position = gl_Vertex;"
"}",

"#version 130\n"
"#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 fragment shader */
/* Quad #8: vertex buffer, apply texture in 1.10 fragment shader */
data->shader[3] = Shader::Create(
"#version 130\n"
"in vec2 in_Vertex;"
"in vec2 in_MultiTexCoord0;"
"in vec4 in_Color;"
"#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 = in_Color;"
" gl_Position = vec4(in_Vertex, 0.0, 1.0);"
" pass_Color = vec4(in_Color, 1.0);"
" gl_Position = vec4(in_Vertex, 1.0);"
"}",

"#version 130\n"
"#version 120\n"
"varying vec4 pass_Color;"
"uniform sampler2D tex;"
"void main()"
@@ -199,20 +221,47 @@ void DebugQuad::TickDraw(float deltams)
" 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;
}
else if (data->initialised && IsDestroying())
{
#if 0
glDeleteBuffers(3, data->buflist);
#endif
glDeleteVertexArrays(NUM_ARRAYS, data->array);
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(1, data->texlist);
glDeleteTextures(NUM_TEXTURES, data->texture);

data->initialised = 0;
}
@@ -256,7 +305,7 @@ void DebugQuad::TickDraw(float deltams)
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, data->texlist[0]);
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);
@@ -288,7 +337,7 @@ void DebugQuad::TickDraw(float deltams)

/* Bind texture */
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, data->texlist[0]);
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);
@@ -322,7 +371,7 @@ void DebugQuad::TickDraw(float deltams)
glUseProgram(0);

/* Prepare our quad coordinates */
vec2i const layout(3, 3);
vec2i const layout(4, 3);
data->step = vec2(2.0f, -2.0f) / (3 * layout + vec2i(1));
data->orig = vec2(-1.0f, 1.0f) + data->step;
data->aa = data->orig;
@@ -373,7 +422,7 @@ void DebugQuad::TickDraw(float deltams)

/* Quad #3: textured quad */
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, data->texlist[0]);
glBindTexture(GL_TEXTURE_2D, data->texture[0]);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glTexCoord2f(f1, f3);
@@ -436,7 +485,7 @@ void DebugQuad::TickDraw(float deltams)
data->shader[2]->Bind();
glColor3f(0.0f, 1.0f, 1.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, data->texlist[0]);
glBindTexture(GL_TEXTURE_2D, data->texture[0]);
glBegin(GL_TRIANGLES);
glTexCoord2f(f1, f3);
glVertex3f(data->aa.x, data->bb.y, 0.0f);
@@ -474,6 +523,7 @@ void DebugQuad::TickDraw(float deltams)

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glUseProgram(0);

Advance();

@@ -498,6 +548,85 @@ void DebugQuad::TickDraw(float deltams)
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glUseProgram(0);

Advance();

/* Quad #9: vertex buffer, apply texture and color in 1.20 shader */
data->shader[4]->Bind();
GLfloat const vertices3[] = { data->aa.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,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glBindVertexArray(data->array[0]);

glBindBuffer(GL_ARRAY_BUFFER, data->buffer[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices3), vertices3,
GL_DYNAMIC_DRAW);
glVertexAttribPointer(data->attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(data->attr[0]);

glBindBuffer(GL_ARRAY_BUFFER, data->buffer[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors,
GL_DYNAMIC_DRAW);
glVertexAttribPointer(data->attr[1], 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(data->attr[1]);

glBindBuffer(GL_ARRAY_BUFFER, data->buffer[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords,
GL_DYNAMIC_DRAW);
glVertexAttribPointer(data->attr[2], 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(data->attr[2]);

glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);

glDisableVertexAttribArray(data->attr[0]);
glDisableVertexAttribArray(data->attr[1]);
glDisableVertexAttribArray(data->attr[2]);
glUseProgram(0);

Advance();

/* Quad #10: vertex buffer, apply texture and color in 1.30 shader */
data->shader[5]->Bind();
GLfloat const vertices4[] = { data->aa.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,
data->aa.x, data->aa.y, 0.0f,
data->aa.x, data->bb.y, 0.0f };

glBindVertexArray(data->array[1]);

glBindBuffer(GL_ARRAY_BUFFER, data->buffer[3]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices4), vertices4,
GL_DYNAMIC_DRAW);
glVertexAttribPointer(data->attr[3], 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(data->attr[3]);

glBindBuffer(GL_ARRAY_BUFFER, data->buffer[4]);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors,
GL_DYNAMIC_DRAW);
glVertexAttribPointer(data->attr[4], 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(data->attr[4]);

glBindBuffer(GL_ARRAY_BUFFER, data->buffer[5]);
glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords,
GL_DYNAMIC_DRAW);
glVertexAttribPointer(data->attr[5], 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(data->attr[5]);

glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);

glDisableVertexAttribArray(data->attr[3]);
glDisableVertexAttribArray(data->attr[4]);
glDisableVertexAttribArray(data->attr[5]);
glUseProgram(0);

Advance();
}


Caricamento…
Annulla
Salva