Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


Cannot get uniform location from GLSL shader


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
4 replies to this topic

#1 Manabreak   Members   -  Reputation: 141

Like
0Likes
Like

Posted 01 September 2012 - 08:02 AM

Hey there, I've got a little problem here with my shaders. I have two shaders, the first one populates a FBO with three textures: the color, the depth and the normal data. Now, the second shader should get these textures as parameters, but I cannot get the uniform location - it just return -1 when I try to get it. The first shader works nicely and I can use the textures after the draw calls are done, but I can't get the second shader to work. It does compile nicely, and no errors are raised.

Here's my "geometry pass":
// Load the shader and set the camera matrices
GL.UseProgram(geometryShaderId);
GL.UniformMatrix4(GL.GetUniformLocation(geometryShaderId, "view"), false, ref Engine.cameras[0].modelview);
GL.UniformMatrix4(GL.GetUniformLocation(geometryShaderId, "projection"), false, ref Engine.cameras[0].projection);

// Bind the frame buffer
GL.BindFramebuffer(FramebufferTarget.DrawFramebuffer, fboId);

// Enable depth stuff
GL.Enable(EnableCap.DepthTest);
GL.DepthMask(true);
GL.Disable(EnableCap.Blend);

// Clear
GL.ClearColor(0f, 0f, 0f, 1f);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

// Render the geometry
RenderScene(e);

// Clean up the geometry pass
GL.UseProgram(0);
GL.DepthMask(false);
GL.Disable(EnableCap.DepthTest);
GL.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);

And here's the "lighting" pass, or, the part that actually bugs:
GL.UseProgram(pointLightShaderId);
GL.BindFramebuffer(FramebufferTarget.FramebufferExt, fboId);
	
// Set the textures for the fragment shader
GL.Uniform1(GL.GetUniformLocation(pointLightShaderId, "colorMap"), 0); // <-- Location is -1
GL.ActiveTexture(TextureUnit.Texture0);
GL.BindTexture(TextureTarget.Texture2D, gbuffer.DiffuseTexture);

The lighting shader is initialized like this:
// Load shader files
string vText = File.ReadAllText("Resources/Shaders/pointlight_vertex.glsl");
string fText = File.ReadAllText("Resources/Shaders/pointlight_fragment.glsl");
  
// Create shader IDs
vertexId = GL.CreateShader(ShaderType.VertexShader);
fragmentId = GL.CreateShader(ShaderType.FragmentShader);
  
// Set shader sources
GL.ShaderSource(vertexId, vText);
GL.ShaderSource(fragmentId, fText);
  
// Compile vertex shader
GL.CompileShader(vertexId);
string vertexLog = GL.GetShaderInfoLog(vertexId);
int vertexStatusCode;
GL.GetShader (vertexId, ShaderParameter.CompileStatus, out vertexStatusCode);
if(vertexStatusCode != 1) Console.WriteLine("Error creating vertex shader: " + vertexLog);
  
// Compile fragment shader
GL.CompileShader(fragmentId);
string fragmentLog = GL.GetShaderInfoLog(fragmentId);
int fragmentStatusCode;
GL.GetShader(fragmentId, ShaderParameter.CompileStatus, out fragmentStatusCode);
if(fragmentStatusCode != 1) Console.WriteLine("Error creating fragment shader: " + fragmentLog);
  
// Create the shader program
shaderId = GL.CreateProgram();
GL.AttachShader(shaderId, vertexId);
GL.AttachShader(shaderId, fragmentId);
  
GL.BindAttribLocation(shaderId, 0, "in_position");
GL.BindFragDataLocation(shaderId, 0, "out_light");
  
GL.LinkProgram(shaderId);
  
int programStatusCode;
GL.GetProgram(shaderId, ProgramParameter.ValidateStatus, out programStatusCode);
if(programStatusCode == (int)All.False)
{
	  Console.WriteLine("Error creating shader program!");
	  Console.WriteLine(GL.GetProgramInfoLog(shaderId));
}
  
GL.ValidateProgram(shaderId);


... And finally, here's the lighting shaders (stubs for now). Here's the vertex shader:
#version 330


uniform mat4 projection;
uniform mat4 view;
uniform mat4 world;

layout(location = 0) in vec3 in_position;


out vec3 worldpos;
out vec4 screenpos;

void main(void)		
{  
   gl_Position = projection * view * world * vec4(0.0, 0.0, 0.0, 1.0);
   worldpos = gl_Position.xyz;
   screenpos = vec4(worldpos, 1.0);
};

... and here's the fragment shader:
#version 330


uniform sampler2D colorMap;

in vec3 worldpos;
in vec4 screenpos;
out vec4 out_light;

void main(void)		
{
   // Just try to paint with magenta, though it doesn't happen <img src='http://public.gamedev.net//public/style_emoticons/<#EMO_DIR#>/sad.png' class='bbc_emoticon' alt=':(' />
   out_light = vec4(1.0, 0.0, 1.0, 1.0);


Sponsor:

#2 Sponji   Members   -  Reputation: 1359

Like
2Likes
Like

Posted 01 September 2012 - 09:35 AM

The uniform is probably optimized out because you don't use it.
Derp

#3 Manabreak   Members   -  Reputation: 141

Like
0Likes
Like

Posted 01 September 2012 - 10:04 AM

Ah, that was it. Thanks!

#4 mv348   Members   -  Reputation: 253

Like
0Likes
Like

Posted 01 September 2012 - 02:47 PM

LOL. I've made this mistake more times than I'll care to admit.

#5 V-man   Members   -  Reputation: 805

Like
0Likes
Like

Posted 02 September 2012 - 05:23 AM

http://www.opengl.org/wiki/GLSL_:_common_mistakes#glGetUniformLocation
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);




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