make shader debugging easier

This commit is contained in:
Tim Felgentreff 2016-05-25 14:01:52 +02:00
parent a1ccfeba61
commit eb151160ef
2 changed files with 71 additions and 47 deletions
src

View file

@ -2,6 +2,7 @@
#define __SHADERS_H__
#ifdef USE_OPENGL
#define MAX_SHADERS 5
// #define SHADERDEBUG // Uncomment for loading shaders from file
#ifndef __APPLE__
extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebuffer;
#else

View file

@ -26,52 +26,52 @@ const char* fragment_shaders[MAX_SHADERS] = {
gl_FragColor = myColor;\n\
}",
// Scale2x
"#version 110\n\
\n\
"#version 110\n\
\n\
uniform sampler2D u_texture;\n\
uniform float u_width;\n\
uniform float u_height;\n\
uniform float u_widthrel;\n\
uniform float u_heightrel;\n\
\n\
void main() {\n\
// o = offset, the width of a pixel\n\
vec2 texCoord = gl_TexCoord[0].xy * vec2(u_widthrel, -u_heightrel);\n\
vec2 textureDimensions = vec2(u_width, u_height);\n\
vec2 o = 1.0 / textureDimensions;\n\
// texel arrangement\n\
// A B C\n\
// D E F\n\
// G H I\n\
vec4 A = texture2D(u_texture, texCoord + vec2( -o.x, o.y));\n\
vec4 B = texture2D(u_texture, texCoord + vec2( 0, o.y));\n\
vec4 C = texture2D(u_texture, texCoord + vec2( o.x, o.y));\n\
vec4 D = texture2D(u_texture, texCoord + vec2( -o.x, 0));\n\
vec4 E = texture2D(u_texture, texCoord + vec2( 0, 0));\n\
vec4 F = texture2D(u_texture, texCoord + vec2( o.x, 0));\n\
vec4 G = texture2D(u_texture, texCoord + vec2( -o.x, -o.y));\n\
vec4 H = texture2D(u_texture, texCoord + vec2( 0, -o.y));\n\
vec4 I = texture2D(u_texture, texCoord + vec2( o.x, -o.y));\n\
vec2 p = texCoord * textureDimensions;\n\
// p = the position within a pixel [0...1]\n\
p = p - floor(p);\n\
if (p.x > .5) {\n\
if (p.y > .5) {\n\
// Top Right\n\
gl_FragColor = B == F && B != D && F != H ? F : E;\n\
} else {\n\
// Bottom Right\n\
gl_FragColor = H == F && D != H && B != F ? F : E;\n\
}\n\
} else {\n\
if (p.y > .5) {\n\
// Top Left\n\
gl_FragColor = D == B && B != F && D != H ? D : E;\n\
} else {\n\
// Bottom Left\n\
gl_FragColor = D == H && D != B && H != F ? D : E;\n\
}\n\
}\n\
uniform float u_heightrel;\n\
\n\
void main() {\n\
// o = offset, the width of a pixel\n\
vec2 texCoord = gl_TexCoord[0].xy * vec2(u_widthrel, -u_heightrel);\n\
vec2 textureDimensions = vec2(u_width, u_height);\n\
vec2 o = 1.0 / textureDimensions;\n\
// texel arrangement\n\
// A B C\n\
// D E F\n\
// G H I\n\
vec4 A = texture2D(u_texture, texCoord + vec2( -o.x, o.y));\n\
vec4 B = texture2D(u_texture, texCoord + vec2( 0, o.y));\n\
vec4 C = texture2D(u_texture, texCoord + vec2( o.x, o.y));\n\
vec4 D = texture2D(u_texture, texCoord + vec2( -o.x, 0));\n\
vec4 E = texture2D(u_texture, texCoord + vec2( 0, 0));\n\
vec4 F = texture2D(u_texture, texCoord + vec2( o.x, 0));\n\
vec4 G = texture2D(u_texture, texCoord + vec2( -o.x, -o.y));\n\
vec4 H = texture2D(u_texture, texCoord + vec2( 0, -o.y));\n\
vec4 I = texture2D(u_texture, texCoord + vec2( o.x, -o.y));\n\
vec2 p = texCoord * textureDimensions;\n\
// p = the position within a pixel [0...1]\n\
p = p - floor(p);\n\
if (p.x > .5) {\n\
if (p.y > .5) {\n\
// Top Right\n\
gl_FragColor = B == F && B != D && F != H ? F : E;\n\
} else {\n\
// Bottom Right\n\
gl_FragColor = H == F && D != H && B != F ? F : E;\n\
}\n\
} else {\n\
if (p.y > .5) {\n\
// Top Left\n\
gl_FragColor = D == B && B != F && D != H ? D : E;\n\
} else {\n\
// Bottom Left\n\
gl_FragColor = D == H && D != B && H != F ? D : E;\n\
}\n\
}\n\
}",
// HQX
"#version 130\n\
@ -359,6 +359,11 @@ GLuint fullscreenShader;
GLuint fullscreenFramebuffer = 0;
GLuint fullscreenTexture;
#ifdef SHADERDEBUG
#include <iostream>
#include <fstream>
#endif
void printShaderInfoLog(GLuint obj, const char* prefix)
{
int infologLength = 0;
@ -401,29 +406,45 @@ extern bool LoadShaders() {
if (fs == 0) {
return false;
}
#ifdef SHADERDEBUG
std::ifstream myfile("fragment.txt");
std::string contents((std::istreambuf_iterator<char>(myfile)),
std::istreambuf_iterator<char>());
const char* f = contents.c_str();
glShaderSource(fs, 1, &f, NULL);
myfile.close();
#else
glShaderSource(fs, 1, (const char**)&(fragment_shaders[ShaderIndex]), NULL);
#endif
glCompileShader(fs);
glGetShaderiv(fs, GL_COMPILE_STATUS, &params);
if (params == GL_FALSE) {
#ifdef SHADERDEBUG
printShaderInfoLog(fs, "Fragment Shader");
#endif
glDeleteShader(fs);
return false;
}
//printShaderInfoLog(fs, "Fragment Shader");
ShaderIndex = (ShaderIndex + 1) % MAX_SHADERS;
vs = glCreateShader(GL_VERTEX_SHADER);
if (fs == 0) {
glDeleteShader(fs);
return false;
#ifdef SHADERDEBUG
printShaderInfoLog(fs, "Fragment Shader");
#endif
glDeleteShader(fs);
return false;
}
glShaderSource(vs, 1, (const char**)&vertex_shader, NULL);
glCompileShader(vs);
glGetShaderiv(fs, GL_COMPILE_STATUS, &params);
if (params == GL_FALSE) {
#ifdef SHADERDEBUG
printShaderInfoLog(vs, "Vertex Shader");
#endif
glDeleteShader(fs);
glDeleteShader(vs);
return false;
}
//printShaderInfoLog(vs, "Vertex Shader");
if (glIsProgram(fullscreenShader)) {
glDeleteProgram(fullscreenShader);
}
@ -438,6 +459,9 @@ extern bool LoadShaders() {
glLinkProgram(fullscreenShader);
glGetProgramiv(fullscreenShader, GL_LINK_STATUS, &params);
if (params == GL_FALSE) {
#ifdef SHADERDEBUG
printProgramInfoLog(fullscreenShader, "Shader Program");
#endif
glDeleteShader(fs);
glDeleteShader(vs);
glDeleteProgram(fullscreenShader);
@ -445,7 +469,6 @@ extern bool LoadShaders() {
}
glDeleteShader(fs);
glDeleteShader(vs);
//printProgramInfoLog(fullscreenShader, "Shader Program");
return true;
}