diff --git a/Outputs/CRT/Internals/CRTOpenGL.cpp b/Outputs/CRT/Internals/CRTOpenGL.cpp index 84df9f966..a951973d4 100644 --- a/Outputs/CRT/Internals/CRTOpenGL.cpp +++ b/Outputs/CRT/Internals/CRTOpenGL.cpp @@ -246,7 +246,6 @@ void OpenGLOutputBuilder::draw_frame(unsigned int output_width, unsigned int out _input_texture_data = (uint8_t *)glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, _input_texture_array_size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); -// printf("%04x\n", glGetError()); _output_mutex->unlock(); } @@ -535,7 +534,7 @@ void OpenGLOutputBuilder::prepare_composite_input_shader() char *fragment_shader = get_input_fragment_shader(); if(vertex_shader && fragment_shader) { - composite_input_shader_program = std::unique_ptr(new OpenGL::Shader(vertex_shader, fragment_shader)); + composite_input_shader_program = std::unique_ptr(new OpenGL::Shader(vertex_shader, fragment_shader, nullptr)); GLint texIDUniform = composite_input_shader_program->get_uniform_location("texID"); GLint phaseCyclesPerTickUniform = composite_input_shader_program->get_uniform_location("phaseCyclesPerTick"); @@ -622,7 +621,7 @@ std::unique_ptr OpenGLOutputBuilder::prepare_output_shader(char if(vertex_shader && fragment_shader) { - shader_program = std::unique_ptr(new OpenGL::Shader(vertex_shader, fragment_shader)); + shader_program = std::unique_ptr(new OpenGL::Shader(vertex_shader, fragment_shader, nullptr)); shader_program->bind(); windowSizeUniform = shader_program->get_uniform_location("windowSize"); diff --git a/Outputs/CRT/Internals/Shader.cpp b/Outputs/CRT/Internals/Shader.cpp index 4bf63c8c6..6c7e621c1 100644 --- a/Outputs/CRT/Internals/Shader.cpp +++ b/Outputs/CRT/Internals/Shader.cpp @@ -38,7 +38,7 @@ GLuint Shader::compile_shader(const char *source, GLenum type) return shader; } -Shader::Shader(const char *vertex_shader, const char *fragment_shader) +Shader::Shader(const char *vertex_shader, const char *fragment_shader, const AttributeBinding *attribute_bindings) { _shader_program = glCreateProgram(); GLuint vertex = compile_shader(vertex_shader, GL_VERTEX_SHADER); @@ -46,6 +46,16 @@ Shader::Shader(const char *vertex_shader, const char *fragment_shader) glAttachShader(_shader_program, vertex); glAttachShader(_shader_program, fragment); + + if(attribute_bindings) + { + while(attribute_bindings->name) + { + glBindAttribLocation(_shader_program, attribute_bindings->index, attribute_bindings->name); + attribute_bindings++; + } + } + glLinkProgram(_shader_program); #if defined(DEBUG) @@ -76,12 +86,12 @@ void Shader::bind() glUseProgram(_shader_program); } -GLint Shader::get_attrib_location(const char *name) +GLint Shader::get_attrib_location(const GLchar *name) { return glGetAttribLocation(_shader_program, name); } -GLint Shader::get_uniform_location(const char *name) +GLint Shader::get_uniform_location(const GLchar *name) { return glGetUniformLocation(_shader_program, name); } diff --git a/Outputs/CRT/Internals/Shader.hpp b/Outputs/CRT/Internals/Shader.hpp index 2f4706bb0..cb1eddc7d 100644 --- a/Outputs/CRT/Internals/Shader.hpp +++ b/Outputs/CRT/Internals/Shader.hpp @@ -14,12 +14,38 @@ namespace OpenGL { class Shader { public: - Shader(const char *vertex_shader, const char *fragment_shader); + struct AttributeBinding { + const GLchar *name; + GLuint index; + }; + + /*! + Constructs a shader, comprised of: + @param vertex_shader The vertex shader source code. + @param fragment_shader The fragment shader source code. + @param attribute_bindings Either @c nullptr or an array terminated by an entry with a @c nullptr-name of attribute bindings. + */ + Shader(const char *vertex_shader, const char *fragment_shader, const AttributeBinding *attribute_bindings); ~Shader(); + /*! + Performs an @c glUseProgram to make this the active shader. + */ void bind(); - GLint get_attrib_location(const char *name); - GLint get_uniform_location(const char *name); + + /*! + Performs a @c glGetAttribLocation call. + @param name The name of the attribute to locate. + @returns The location of the requested attribute. + */ + GLint get_attrib_location(const GLchar *name); + + /*! + Performs a @c glGetUniformLocation call. + @param name The name of the uniform to locate. + @returns The location of the requested uniform. + */ + GLint get_uniform_location(const GLchar *name); private: GLuint compile_shader(const char *source, GLenum type);