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);
Male
