Second Shader not working

Started by
2 comments, last by tempvar 11 years, 4 months ago
Hey everyone,

I've got a strange problem most likely tied to my inexperience with using shaders. Basically only my first shader program seems to work. I'm doing error checking with glGetShaderInfoLog etc and the shaders seem to compile fine. I've also been trying to print out the active uniform variables and it will only ever work for the first shader that I create.

Some pseudo code for my program flow:


LoadAllMeshes();

int shader1 = CreateShader("passthrough.vert", "passthrough.frag");
int shader2 = CreateShader("diffuse.vert", "diffuse.frag");
glUseProgram(shader1);

void SetUniforms()
{
// set uniforms here for shader1 or 2, depending on which is bound
}

void PrintActiveUniforms()
{
// print active uniforms here. If shader1 is bound, the uniforms are printed fine. If shader2 is bound the uniforms do not print out.
}

void Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
RenderAllGeometry();
glfwSwapBuffers();
}
void RenderAllGeometry()
{
for (int i = 0; i < meshes.size(); i++)
{
GLuint vao = meshes.at(i)->getVao();
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, mesh->GetIndexBuffer().Size(), GL_UNSIGNED_INT, BUFFER_OFFSET(0));
glBindVertexArray(0);
}
}


This all works perfectly if it is shader1 that is bound, but shader2 being bound results in nothing being drawn. I've tested both shaders and they work, but it's only ever the first program created that will result in the geometry rendering with that shader.

I can't see why this isn't working and I can post more code if needed. But basically my shader loading code is taken from a tutorial website and I can actually get something drawing with the first bound shader. The only thing I can think of is that vertex array objects might have an effect on the shaders used?

Thanks for the assistance in advance.
Advertisement
Try unsigned ints instead of ints.

o3o

Just tried that, didn't change anything but I should keep them as GLuint because that's what they should have been anyway.

I stepped through setting up uniforms for the second created shader. It had a program ID of 6, which is correct (first shader has 1,2 for vert and frag and 3 for programID and same with the second).

I then call


GLuint uniformId = glGetUniformLocation(shader2, "MVP");
glUniformMatrix4fv(uniformId, 1, GL_FALSE, &mat[0][0]);


uniformId ends up equal to some absurdly large integer. The shader does contain the uniform mat4 MVP variable. If it was shader1 that was bound, this would work fine and uniformId wouldn't be some absurdly large number.

I could just swap the diffuse and passthrough shader around and i'd get the same problem, only the first created one will work.
Ah found the problem, the second shader was getting unbound somewhere in another function. Good ole debugging.

This topic is closed to new replies.

Advertisement