Jump to content

  • Log In with Google      Sign In   
  • Create Account

Second Shader not working


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 tempvar   Members   -  Reputation: 152

Like
0Likes
Like

Posted 27 November 2012 - 09:37 AM

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.

Sponsor:

#2 Waterlimon   Crossbones+   -  Reputation: 2635

Like
0Likes
Like

Posted 27 November 2012 - 10:10 AM

Try unsigned ints instead of ints.

o3o


#3 tempvar   Members   -  Reputation: 152

Like
0Likes
Like

Posted 27 November 2012 - 10:17 AM

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.

Edited by tempvar, 27 November 2012 - 10:18 AM.


#4 tempvar   Members   -  Reputation: 152

Like
0Likes
Like

Posted 27 November 2012 - 11:08 AM

Ah found the problem, the second shader was getting unbound somewhere in another function. Good ole debugging.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS