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
out_light = vec4(1.0, 0.0, 1.0, 1.0);