Mercurial > hg > openttd
changeset 20545:ed076b6fca0b draft
-Codechange: [OpenGL] Use generic vertex attributes in the shader program.
author | Michael Lutz <michi@icosahedron.de> |
---|---|
date | Sun, 02 Jun 2013 00:28:04 +0200 |
parents | ef2b5b14c3bc |
children | 9b3254738575 |
files | src/table/opengl_shader.h src/video/opengl.cpp |
diffstat | 2 files changed, 34 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/table/opengl_shader.h +++ b/src/table/opengl_shader.h @@ -12,9 +12,11 @@ /** Vertex shader that just passes colour and tex coords through. */ static const char *_vertex_shader_direct[] = { "#version 110\n", + "attribute vec2 position, colour_uv;", + "varying vec2 colour_tex_uv;", "void main() {", - " gl_TexCoord[0] = gl_MultiTexCoord0;", - " gl_Position = gl_Vertex;", + " colour_tex_uv = colour_uv;", + " gl_Position = vec4(position, 0.0, 1.0);", "}", }; @@ -22,7 +24,8 @@ static const char *_frag_shader_direct[] = { "#version 110\n", "uniform sampler2D colour_tex;", + "varying vec2 colour_tex_uv;", "void main() {", - " gl_FragColor = texture2D(colour_tex, gl_TexCoord[0].st);", + " gl_FragColor = texture2D(colour_tex, colour_tex_uv);", "}", };
--- a/src/video/opengl.cpp +++ b/src/video/opengl.cpp @@ -64,6 +64,11 @@ static PFNGLGETUNIFORMLOCATIONPROC _glGetUniformLocation; static PFNGLUNIFORM1IPROC _glUniform1i; +static PFNGLGETATTRIBLOCATIONPROC _glGetAttribLocation; +static PFNGLENABLEVERTEXATTRIBARRAYPROC _glEnableVertexAttribArray; +static PFNGLDISABLEVERTEXATTRIBARRAYPROC _glDisableVertexAttribArray; +static PFNGLVERTEXATTRIBPOINTERARBPROC _glVertexAttribPointer; + /** A simple 2D vertex with just position and texture. */ struct Simple2DVertex { float x, y; @@ -229,6 +234,11 @@ _glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetShaderInfoLog"); _glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocation"); _glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1i"); + + _glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)GetOGLProcAddress("glGetAttribLocation"); + _glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glEnableVertexAttribArray"); + _glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glDisableVertexAttribArray"); + _glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERARBPROC)GetOGLProcAddress("glVertexAttribPointer"); } else { /* In the ARB extension programs and shaders are in the same object space. */ _glCreateProgram = (PFNGLCREATEPROGRAMPROC)GetOGLProcAddress("glCreateProgramObjectARB"); @@ -246,11 +256,17 @@ _glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetOGLProcAddress("glGetInfoLogARB"); _glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetOGLProcAddress("glGetUniformLocationARB"); _glUniform1i = (PFNGLUNIFORM1IPROC)GetOGLProcAddress("glUniform1iARB"); + + _glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)GetOGLProcAddress("glGetAttribLocationARB"); + _glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glEnableVertexAttribArrayARB"); + _glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)GetOGLProcAddress("glDisableVertexAttribArrayARB"); + _glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERARBPROC)GetOGLProcAddress("glVertexAttribPointerARB"); } return _glCreateProgram != NULL && _glDeleteProgram != NULL && _glLinkProgram != NULL && _glGetProgramiv != NULL && _glGetProgramInfoLog != NULL && _glCreateShader != NULL && _glDeleteShader != NULL && _glShaderSource != NULL && _glCompileShader != NULL && _glAttachShader != NULL && - _glGetShaderiv != NULL && _glGetShaderInfoLog != NULL && _glGetUniformLocation != NULL && _glUniform1i != NULL; + _glGetShaderiv != NULL && _glGetShaderInfoLog != NULL && _glGetUniformLocation != NULL && _glUniform1i != NULL && + _glGetAttribLocation != NULL && _glEnableVertexAttribArray != NULL && _glDisableVertexAttribArray != NULL && _glVertexAttribPointer != NULL; } @@ -300,7 +316,11 @@ if (!IsOpenGLVersionAtLeast(3, 0) && (!IsOpenGLExtensionSupported("GL_ARB_vertex_array_object") || !IsOpenGLExtensionSupported("GL_APPLE_vertex_array_object"))) return "Vertex array objects not supported"; if (!BindVBAExtension()) return "Failed to bind VBA extension functions"; /* Check for shader objects. */ - if (!IsOpenGLVersionAtLeast(2, 0) && !IsOpenGLExtensionSupported("GL_ARB_shader_objects")) return "No shader support"; + if (!IsOpenGLVersionAtLeast(2, 0)) { + if (!IsOpenGLExtensionSupported("GL_ARB_shader_objects")) return "No shader support"; + if (!IsOpenGLExtensionSupported("GL_ARB_vertex_program")) return "Vertex programs not supported"; + if (!IsOpenGLExtensionSupported("GL_ARB_vertex_shader")) return "Vertex shaders not supported"; + } if (!BindShaderExtensions()) return "Failed to bind shader extension functions"; DEBUG(driver, 2, "OpenGL shading language version: %s", (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION)); @@ -349,10 +369,12 @@ if (glGetError() != GL_NO_ERROR) return "Can't generate VBO for fullscreen quad"; /* Set vertex state. */ - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glVertexPointer(2, GL_FLOAT, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, x)); - glTexCoordPointer(2, GL_FLOAT, sizeof(Simple2DVertex), (GLvoid *)offsetof(Simple2DVertex, u)); + GLint loc_position = _glGetAttribLocation(this->vid_program, "position"); + GLint colour_position = _glGetAttribLocation(this->vid_program, "colour_uv"); + _glEnableVertexAttribArray(loc_position); + _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); glClearColor(0.0f, 0.0f, 0.0f, 1.0f);