• Advertisement
Sign in to follow this  

Cannot get uniform location from GLSL shader

This topic is 1966 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

And here's the "lighting" pass, or, the part that actually bugs:
[CODE]
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);
[/CODE]

The lighting shader is initialized like this:
[CODE]
// 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);

[/CODE]

... And finally, here's the lighting shaders (stubs for now). Here's the vertex shader:
[CODE]
#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);
};
[/CODE]

... and here's the fragment shader:
[CODE]
#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 :(
out_light = vec4(1.0, 0.0, 1.0, 1.0);
[/CODE]

Share this post


Link to post
Share on other sites
Advertisement
http://www.opengl.org/wiki/GLSL_:_common_mistakes#glGetUniformLocation

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement