- use explicit vertex attributes for everything.

No more glVertex, glTexCoord or glColor calls anywhere.
This commit is contained in:
Christoph Oelckers 2019-10-06 10:46:23 +02:00
parent 0720ad5fd5
commit 3d538b4c8f
7 changed files with 44 additions and 34 deletions

View file

@ -71,10 +71,9 @@ bool FShader::Load(const char * name, const char * vert_prog, const char * frag_
glAttachShader(hShader, hVertProg); glAttachShader(hShader, hVertProg);
glAttachShader(hShader, hFragProg); glAttachShader(hShader, hFragProg);
//glBindAttribLocation(hShader, VATTR_VERTEX, "aPosition"); glBindAttribLocation(hShader, 0, "i_vertPos");
//glBindAttribLocation(hShader, VATTR_TEXCOORD, "aTexCoord"); glBindAttribLocation(hShader, 1, "i_texCoord");
//glBindAttribLocation(hShader, VATTR_COLOR, "aColor"); glBindAttribLocation(hShader, 2, "i_color");
//glBindAttribLocation(hShader, VATTR_VERTEX2, "aVertex2");
glLinkProgram(hShader); glLinkProgram(hShader);
@ -201,9 +200,6 @@ bool SurfaceShader::Load(const char* name, const char* vert_prog, const char* fr
SamplerLoc = glGetUniformLocation(hShader, "s_palette"); SamplerLoc = glGetUniformLocation(hShader, "s_palette");
glUniform1i(SamplerLoc, 1); glUniform1i(SamplerLoc, 1);
glBindAttribLocation(hShader, 0, "i_vertPos");
glBindAttribLocation(hShader, 1, "i_texCoord");
glUseProgram(0); glUseProgram(0);
return true; return true;
} }

View file

@ -172,8 +172,8 @@ void GLInstance::Draw(EDrawType type, size_t start, size_t count)
auto p = &Buffer[start]; auto p = &Buffer[start];
for (size_t i = 0; i < count; i++, p++) for (size_t i = 0; i < count; i++, p++)
{ {
glTexCoord2f(p->u, p->v); glVertexAttrib2f(1, p->u, p->v);
glVertex3f(p->x, p->y, p->z); glVertexAttrib3f(0, p->x, p->y, p->z);
} }
glEnd(); glEnd();
} }
@ -315,7 +315,7 @@ void GLInstance::SetCull(int type, int winding)
void GLInstance::SetColor(float r, float g, float b, float a) void GLInstance::SetColor(float r, float g, float b, float a)
{ {
glColor4f(r, g, b, a); glVertexAttrib4f(2, r, g, b, a);
} }
void GLInstance::SetDepthFunc(int func) void GLInstance::SetDepthFunc(int func)

View file

@ -1,16 +1,18 @@
// YUV->RGB conversion fragment shader adapted from // YUV->RGB conversion fragment shader adapted from
// http://www.fourcc.org/fccyvrgb.php: Want some sample code? // http://www.fourcc.org/fccyvrgb.php: Want some sample code?
// direct link: http://www.fourcc.org/source/YUV420P-OpenGL-GLSLang.c // direct link: http://www.fourcc.org/source/YUV420P-OpenGL-GLSLang.c
#version 120 #version 330
uniform sampler2D tex; uniform sampler2D tex;
in vec2 v_texCoord;
out vec4 FragColor;
void main(void) { void main(void) {
float r,g,b,y,u,v; float r,g,b,y,u,v;
vec3 yuv; vec3 yuv;
yuv = texture2D(tex, gl_TexCoord[0].st).rgb; yuv = texture2D(tex, v_texCoord.st).rgb;
y = yuv.r; y = yuv.r;
u = yuv.g; u = yuv.g;
v = yuv.b; v = yuv.b;
@ -23,5 +25,5 @@ void main(void) {
g = y - 0.39173*u - 0.81290*v; g = y - 0.39173*u - 0.81290*v;
b = y + 2.017*u; b = y + 2.017*u;
gl_FragColor = vec4(r,g,b,1.0); FragColor = vec4(r,g,b,1.0);
}; };

View file

@ -1,7 +1,13 @@
#version 110 #version 330
in vec4 i_vertPos;
in vec4 i_texCoord;
out vec2 v_texCoord;
void main() void main()
{ {
gl_Position = gl_Vertex; gl_Position = i_vertPos;
gl_TexCoord[0] = gl_MultiTexCoord0; v_texCoord = i_texCoord.st;
} }

View file

@ -6,6 +6,7 @@ uniform sampler2D s_texture;
uniform sampler2D s_palette; uniform sampler2D s_palette;
in vec2 v_texCoord; in vec2 v_texCoord;
out vec4 FragColor;
const float c_paletteScale = 255.0/256.0; const float c_paletteScale = 255.0/256.0;
const float c_paletteOffset = 0.5/256.0; const float c_paletteOffset = 0.5/256.0;
@ -16,5 +17,5 @@ void main()
color.r = c_paletteOffset + c_paletteScale*color.r; color.r = c_paletteOffset + c_paletteScale*color.r;
color.rgb = texture2D(s_palette, color.rg).rgb; color.rgb = texture2D(s_palette, color.rg).rgb;
gl_FragColor = color; FragColor = color;
} }

View file

@ -1,13 +1,13 @@
#version 330 #version 330
attribute vec4 i_vertPos; in vec4 i_vertPos;
attribute vec2 i_texCoord; in vec4 i_texCoord;
out vec2 v_texCoord; out vec2 v_texCoord;
void main() void main()
{ {
gl_Position = i_vertPos; gl_Position = i_vertPos;
v_texCoord = i_texCoord; v_texCoord = i_texCoord.st;
} }

View file

@ -1,11 +1,11 @@
#version 120 #version 330
varying vec4 v_color; out vec4 v_color;
varying float v_distance; out float v_distance;
varying vec4 v_texCoord; out vec4 v_texCoord;
varying vec4 v_detailCoord; out vec4 v_detailCoord;
varying vec4 v_glowCoord; out vec4 v_glowCoord;
varying float v_fogCoord; out float v_fogCoord;
uniform float u_usePalette; uniform float u_usePalette;
uniform mat4 u_rotMatrix; uniform mat4 u_rotMatrix;
@ -14,25 +14,30 @@ uniform mat4 u_projectionMatrix;
uniform mat4 u_detailMatrix; uniform mat4 u_detailMatrix;
uniform mat4 u_glowMatrix; uniform mat4 u_glowMatrix;
in vec4 i_vertPos;
in vec4 i_texCoord;
in vec4 i_color;
const float c_zero = 0.0; const float c_zero = 0.0;
const float c_one = 1.0; const float c_one = 1.0;
void main() void main()
{ {
vec4 vertex = u_rotMatrix * gl_Vertex; vec4 vertex = u_rotMatrix * i_vertPos;
vec4 eyeCoordPosition = u_modelMatrix * vertex; vec4 eyeCoordPosition = u_modelMatrix * vertex;
gl_Position = u_projectionMatrix * eyeCoordPosition; gl_Position = u_projectionMatrix * eyeCoordPosition;
eyeCoordPosition.xyz /= eyeCoordPosition.w; eyeCoordPosition.xyz /= eyeCoordPosition.w;
v_texCoord = gl_MultiTexCoord0; v_texCoord = i_texCoord;
//gl_TexCoord[0] = mix(gl_TexCoord[0].xyzw, gl_TexCoord[0].yxzw, u_usePalette); WTF is this??? //gl_TexCoord[0] = mix(gl_TexCoord[0].xyzw, gl_TexCoord[0].yxzw, u_usePalette); WTF is this???
v_detailCoord = u_detailMatrix * gl_MultiTexCoord0; v_detailCoord = u_detailMatrix * i_texCoord;
v_glowCoord = u_glowMatrix * gl_MultiTexCoord0; v_glowCoord = u_glowMatrix * i_texCoord;
v_fogCoord = abs(eyeCoordPosition.z); v_fogCoord = abs(eyeCoordPosition.z);
v_color = gl_Color; v_color = i_color;
v_distance = gl_Vertex.z; v_distance = i_vertPos.z;
} }