Opengl延迟照明着色器

时间:2013-04-24 11:08:15

标签: opengl shader deferred-rendering deferred-shading

我刚开始学习OpenGL 3.1,我正在尝试对我的引擎(框架?)实现延迟着色。我为第一阶段,照明阶段和延迟阶段编写了简单的着色器。 照明阶段从延迟纹理中获取漫反射颜色并将其保存在照明纹理中。延迟阶段绘制照明纹理。在灯光着色器是一个bug,场景很奇怪。它看起来像this,看起来应该像this。照明阶段顶点着色器:

#version 150

in vec4 vertex;

out vec2 position;

void main(void)
{
   gl_Position = vertex*2-1;
   gl_Position.z = 0.0;

   position.xy = vertex.xy;
}

照明阶段片段着色器:

#version 150

in vec2 position;

uniform sampler2D diffuseTexture;
uniform sampler2D positionTexture;

out vec4 lightingOutput;

void main()
{
    vec4 diffuse = texture(diffuseTexture, vec2(position.x, position.y));
    vec4 position = texture(positionTexture, position.xy);

    vec4 ambient = vec4(0.05, 0.05, 0.05, 1.0) * diffuse;

    lightingOutput = diffuse;
}

这就是我在灯光舞台上呈现的内容:

static const GLfloat _vertices[] =
{
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,

    0.0f, 1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    1.0f,  1.0f, 0.0f,
};

这就是我渲染它的方式:

glUseProgram( programID[2] );

glEnableVertexAttribArray(vertexID[1]);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(
    vertexID[1],
    3,                  // size
    GL_FLOAT,           // type
    GL_FALSE,           // normalized?
    0,                  // stride
    (void*)0            // array buffer offset
    );

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, positionTexture);
glUniform1i(positionTextureID[1], 1);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, diffuseTexture);
glUniform1i(diffuseTextureID[1], 0);

glDrawArrays( GL_TRIANGLES, 0, 6 );

glDisableVertexAttribArray(vertexID[1]);

如果您需要所有代码,请访问www.dropbox.com/s/hvfe4v4pb1pfxb3/code.zip。

如何解决这个奇怪的问题?

0 个答案:

没有答案