Sign in to follow this  
tempvar

Second Shader not working

Recommended Posts

tempvar    152
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:

[CODE]
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);
}
}
[/CODE]

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.

Share this post


Link to post
Share on other sites
tempvar    152
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

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

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. Edited by tempvar

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this