1
0
Fork 0

Codechange: [OpenGL] Use generic vertex attributes in the shader program.

pull/8729/head
Michael Lutz 2021-01-16 16:43:21 +01:00
parent acf59f6b68
commit 90fd8f8cda
2 changed files with 29 additions and 8 deletions

View File

@ -12,9 +12,11 @@
/** Vertex shader that just passes colour and tex coords through. */ /** Vertex shader that just passes colour and tex coords through. */
static const char *_vertex_shader_direct[] = { static const char *_vertex_shader_direct[] = {
"#version 110\n", "#version 110\n",
"attribute vec2 position, colour_uv;",
"varying vec2 colour_tex_uv;",
"void main() {", "void main() {",
" gl_TexCoord[0] = gl_MultiTexCoord0;", " colour_tex_uv = colour_uv;",
" gl_Position = gl_Vertex;", " gl_Position = vec4(position, 0.0, 1.0);",
"}", "}",
}; };
@ -22,7 +24,8 @@ static const char *_vertex_shader_direct[] = {
static const char *_frag_shader_direct[] = { static const char *_frag_shader_direct[] = {
"#version 110\n", "#version 110\n",
"uniform sampler2D colour_tex;", "uniform sampler2D colour_tex;",
"varying vec2 colour_tex_uv;",
"void main() {", "void main() {",
" gl_FragColor = texture2D(colour_tex, gl_TexCoord[0].st);", " gl_FragColor = texture2D(colour_tex, colour_tex_uv);",
"}", "}",
}; };

View File

@ -64,6 +64,11 @@ static PFNGLGETSHADERINFOLOGPROC _glGetShaderInfoLog;
static PFNGLGETUNIFORMLOCATIONPROC _glGetUniformLocation; static PFNGLGETUNIFORMLOCATIONPROC _glGetUniformLocation;
static PFNGLUNIFORM1IPROC _glUniform1i; static PFNGLUNIFORM1IPROC _glUniform1i;
static PFNGLGETATTRIBLOCATIONPROC _glGetAttribLocation;
static PFNGLENABLEVERTEXATTRIBARRAYPROC _glEnableVertexAttribArray;
static PFNGLDISABLEVERTEXATTRIBARRAYPROC _glDisableVertexAttribArray;
static PFNGLVERTEXATTRIBPOINTERARBPROC _glVertexAttribPointer;
/** A simple 2D vertex with just position and texture. */ /** A simple 2D vertex with just position and texture. */
struct Simple2DVertex { struct Simple2DVertex {
float x, y; float x, y;
@ -209,6 +214,11 @@ static bool BindShaderExtensions()
_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetShaderInfoLog"); _glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetShaderInfoLog");
_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocation"); _glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocation");
_glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1i"); _glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1i");
_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)GetOGLProcAddress("glGetAttribLocation");
_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glEnableVertexAttribArray");
_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glDisableVertexAttribArray");
_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERARBPROC)GetOGLProcAddress("glVertexAttribPointer");
} else { } else {
/* In the ARB extension programs and shaders are in the same object space. */ /* In the ARB extension programs and shaders are in the same object space. */
_glCreateProgram = (PFNGLCREATEPROGRAMPROC)GetOGLProcAddress("glCreateProgramObjectARB"); _glCreateProgram = (PFNGLCREATEPROGRAMPROC)GetOGLProcAddress("glCreateProgramObjectARB");
@ -226,11 +236,17 @@ static bool BindShaderExtensions()
_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetInfoLogARB"); _glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetInfoLogARB");
_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocationARB"); _glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocationARB");
_glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1iARB"); _glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1iARB");
_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)GetOGLProcAddress("glGetAttribLocationARB");
_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glEnableVertexAttribArrayARB");
_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glDisableVertexAttribArrayARB");
_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERARBPROC)GetOGLProcAddress("glVertexAttribPointerARB");
} }
return _glCreateProgram != nullptr && _glDeleteProgram != nullptr && _glLinkProgram != nullptr && _glGetProgramiv != nullptr && _glGetProgramInfoLog != nullptr && return _glCreateProgram != nullptr && _glDeleteProgram != nullptr && _glLinkProgram != nullptr && _glGetProgramiv != nullptr && _glGetProgramInfoLog != nullptr &&
_glCreateShader != nullptr && _glDeleteShader != nullptr && _glShaderSource != nullptr && _glCompileShader != nullptr && _glAttachShader != nullptr && _glCreateShader != nullptr && _glDeleteShader != nullptr && _glShaderSource != nullptr && _glCompileShader != nullptr && _glAttachShader != nullptr &&
_glGetShaderiv != nullptr && _glGetShaderInfoLog != nullptr && _glGetUniformLocation != nullptr && _glUniform1i != nullptr; _glGetShaderiv != nullptr && _glGetShaderInfoLog != nullptr && _glGetUniformLocation != nullptr && _glUniform1i != nullptr &&
_glGetAttribLocation != nullptr && _glEnableVertexAttribArray != nullptr && _glDisableVertexAttribArray != nullptr && _glVertexAttribPointer != nullptr;
} }
/** Callback to receive OpenGL debug messages. */ /** Callback to receive OpenGL debug messages. */
@ -417,10 +433,12 @@ const char *OpenGLBackend::Init()
if (glGetError() != GL_NO_ERROR) return "Can't generate VBO for fullscreen quad"; if (glGetError() != GL_NO_ERROR) return "Can't generate VBO for fullscreen quad";
/* Set vertex state. */ /* Set vertex state. */
glEnableClientState(GL_VERTEX_ARRAY); GLint loc_position = _glGetAttribLocation(this->vid_program, "position");
glEnableClientState(GL_TEXTURE_COORD_ARRAY); GLint colour_position = _glGetAttribLocation(this->vid_program, "colour_uv");
glVertexPointer(2, GL_FLOAT, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, x)); _glEnableVertexAttribArray(loc_position);
glTexCoordPointer(2, GL_FLOAT, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, u)); _glEnableVertexAttribArray(colour_position);
_glVertexAttribPointer(loc_position, 2, GL_FLOAT, GL_FALSE, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, x));
_glVertexAttribPointer(colour_position, 2, GL_FLOAT, GL_FALSE, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, u));
_glBindVertexArray(0); _glBindVertexArray(0);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);