I have a very simple vertex shader that takes in vertex position and normals and a MVP matrix:
I want to try out basic diffuse lighting; to do that I need the model matrix to put the normals in world space. So instead of passing a MVP matrix, I pass seperate model, view, and projection matrices, then multiply them in the shader.Code :#version 130 in vec3 in_Position; in vec3 in_Normal; out vec4 ex_Color; //wierd stuff - works if MVPMatrix uniform is updated, even if it's not used in main() uniform mat4 PMatrix; uniform mat4 VMatrix; uniform mat4 MMatrix; uniform mat4 MVPMatrix; void main(void) { ex_Color = vec4(0.0, 1.0, 1.0, 1.0); gl_Position = (PMatrix * VMatrix * MMatrix) * vec4(in_Position, 1.0); }
The strange thing is, this only works if I also upload the MVP matrix multiplied on the C++ side to the MVPMatrix uniform, even if that uniform is not actually used to calculate gl_Position. So in the above shader, if I comment out uniform mat4 MVPMatrix and don't upload it in the C++ code, the shader doesn't work and nothing is rendered. Also strange, if I upload the MVP matrix to a uniform called mvpMatrix, it doesn't work. The name of the uniform has to be MVPMatrix, and I have no idea why.
Here's my code to upload the uniform, part of a shader class:
And on the C++ side I have:Code :void Shader::updateUniform(const char * name, glm::vec2 uniform){ glUseProgram(this->progId); GLuint dimenUniLoc = glGetUniformLocation(this->progId, name); glUniform2fv(dimenUniLoc, 1, &uniform[0]); glUseProgram(0); } void Shader::updateUniform(const char * name, glm::vec3 uniform){ glUseProgram(this->progId); GLuint posUniLoc = glGetUniformLocation(this->progId, name); glUniform3f(posUniLoc, uniform.x, uniform.y, uniform.z); glUseProgram(0); } void Shader::updateUniform(const char * name, glm::mat4 uniform){ glUseProgram(this->progId); GLuint matUniLocBrush = glGetUniformLocation(this->progId, name); glUniformMatrix4fv(matUniLocBrush, 1, GL_FALSE, &uniform[0][0]); glUseProgram(0); }
Code :modelMat = mat4(1.0f); viewMat = mat4(1.0f); projMat = mat4(1.0f); propShader.loadShaders("propVertShader.glsl", "propFragShader.glsl"); projMat = perspective(60.0f, 16.0f/9.0f, 0.001f, 1000.0f); viewMat = lookAt(vec3(4, 10, 3), vec3(0, 0, 0), vec3(0, 1, 0)); mat4 mvpMat = projMat * viewMat * modelMat; propShader.updateUniform("PMatrix", projMat); propShader.updateUniform("MMatrix", modelMat); propShader.updateUniform("VMatrix", viewMat); propShader.updateUniform("MVPMatrix", mvpMat);
Does anyone have some idea how this could happen?



Reply With Quote