为什么OpenGL + GLSL着色器不输出任何东西?

时间:2012-04-15 10:07:22

标签: opengl glsl shader

总之,我的全屏着色器没有输出任何内容,

我正在GLSL中编写一个延迟着色器,我已经进入了在屏幕空间中应用灯光的阶段。我有一个环境传递,我基本上将漫反射强度从GBuffer写入默认的FBO,这很好。然后我应用另一个全屏四边形来计算场景中的方向光,再次从GBUffer中采样,并且应该与默认的FBO混合。

我遇到的问题是定向灯着色器不输出任何内容。我使用与环境传递相同的矩阵和变换,但没有任何变化。

我尝试了以下内容;

  1. 在环境过程中的每个片段输出相同的颜色,以确保它完全输出。 (工程)
  2. 在定向光通道中的每个片段输出相同的颜色。 (仍然一无所获)
  3. 使用XY顶点坐标的屏幕分辨率而不是标准化坐标;
    • 这适用于环境传递,因为我可以看到结果按预期更改。
    • 它没有改变定向光通过,我得到相同的输出。
  4. 将环境着色器更改为正常缓冲区或位置缓冲区中的样本,以确保可以从(工作)中采样纹理
  5. 这是应用程序代码;

    glBindFramebuffer(GL_READ_FRAMEBUFFER, m_GeometryBuffer->m_Name);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
    glDrawBuffers(1,draw_buffers);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    m_AmbientShader->Begin();
        m_AmbientShader->SetUniformInt1("Diffuse",m_DiffuseTexture->m_TextureUnit);
        // Draw full screen quad
        glBegin(GL_QUADS);
            glMultiTexCoord2i(GL_TEXTURE0,0,0);
            glVertex2i(-1,-1);
            glMultiTexCoord2i(GL_TEXTURE0,1,0);
            glVertex2i(1,-1);
            glMultiTexCoord2i(GL_TEXTURE0,1,1);
            glVertex2i(1,1);
            glMultiTexCoord2i(GL_TEXTURE0,0,1);
            glVertex2i(-1,1);
        glEnd();
    m_AmbientShader->End();
    
    const DirectionalLight& dl = scene.GetDirectionalLight();
    
    glDrawBuffers(1, draw_buffers);
    m_DirectionalLightShader->Begin();
    m_DirectionalLightShader->SetUniformInt1("Diffuse",m_DiffuseTexture->m_TextureUnit);
    m_DirectionalLightShader->SetUniformInt1("Position",m_PositionTexture->m_TextureUnit);
    m_DirectionalLightShader->SetUniformInt1("Normal",m_NormalTexture->m_TextureUnit);
    m_DirectionalLightShader->SetUniformFloat3("LightDir",dl.GetDirection());
    m_DirectionalLightShader->SetUniformFloat3("LightAmb",dl.GetAmb());
    m_DirectionalLightShader->SetUniformFloat3("LightDiff",dl.GetDiff());
    m_DirectionalLightShader->SetUniformFloat3("LightSpec",dl.GetSpec());
    m_DirectionalLightShader->SetUniformFloat3("LightAtt",dl.GetAtt());
    m_DirectionalLightShader->SetUniformFloat1("LightIntensity",dl.GetIntensity());
        // Draw full screen quad
        glBegin(GL_QUADS);
            glMultiTexCoord2i(GL_TEXTURE0,0,0);
            glVertex2i(-1,-1);
            glMultiTexCoord2i(GL_TEXTURE0,1,0);
            glVertex2i(1,-1);
            glMultiTexCoord2i(GL_TEXTURE0,1,1);
            glVertex2i(1,1);
            glMultiTexCoord2i(GL_TEXTURE0,0,1);
            glVertex2i(-1,1);
        glEnd();
    m_DirectionalLightShader->End();
    

    请原谅我,如果我的数学错误,我一直在搞乱着色器试图得到任何类型的输出,但这里是着色器源文件;

    < - directional_light.vert - >

    varying out vec2 ScreenPos;
    
    varying out vec3 VSLightDir;
    
    uniform vec3 LightDir;
    uniform vec3 LightAmb;
    uniform vec3 LightDiff;
    uniform vec3 LightSpec;
    uniform float LightIntensity;
    
    void main()
    {
        gl_Position = gl_Vertex;
        ScreenPos = gl_MultiTexCoord0.st;
        VSLightDir = normalize((gl_ModelViewMatrix * vec4(LightDir,0.0)).xyz);
    }
    

    < - directional_light.frag - >

    // Gbuffer textures
    uniform sampler2D Diffuse;
    uniform sampler2D Position;
    uniform sampler2D Normal;
    
    in vec2 ScreenPos;
    uniform vec3 LightDir;
    uniform vec3 LightAmb;
    uniform vec3 LightDiff;
    uniform vec3 LightSpec;
    uniform float LightIntensity;
    
    in vec3 VSLightDir;
    out vec4 OutColour;
    
    void main()
    {
        // Sample from the GBuffer
        vec4 Diffuse = texture2D(Diffuse, ScreenPos);
        vec4 VSPos = texture2D(Position, ScreenPos);
        vec4 MRT2 = texture2D(Normal, ScreenPos);
        vec3 VSNormal = normalize(MRT2.xyz);
        float Shininess = MRT2.w;
    
        float LDotN = dot(VSNormal, VSLightDir);
    
        vec3 View = -normalize(VSPos.xyz);
    
        // Compute ambient contribution
        vec3 ambient = LightIntensity * LightAmb * Diffuse.xyz;
    
        // Compute diffuse contribution
        vec3 diffuse = LightIntensity * LightDiff * Diffuse.xyz * max(0.0, LDotN);
    
        // Compute specular contribution
        vec3 HalfWay = normalize(LightDir + View);
        vec3 specular = (LDotN <= 0.0)
                    ? vec3(0.0)
                    : LightIntensity * LightSpec * Diffuse.xyz * pow(max(0.0, dot(VSNormal,HalfWay)), Shininess);
    
        OutColour = vec4(ambient + diffuse + specular, Diffuse.a);
        //OutColour = vec4(0.0,0.0,1.0,1.0); //Debug line
    }
    

    &lt; - ambient.vert - &gt;

    varying out vec2 ScreenPos;
    
    void main()
    {
        gl_Position = gl_Vertex;
    
        // Used for the position to sample from GBuffer
        ScreenPos = gl_MultiTexCoord0.st;
    }
    

    &lt; - ambient.frag - &gt;

    // Gbuffer textures
    uniform sampler2D Diffuse;
    
    in vec2 ScreenPos;
    
    out vec4 OutColour;
    
    void main()
    {
        OutColour = texture2D(Diffuse, ScreenPos);
        //OutColour = vec4(0.0,0.0,1.0,1.0);
    }
    

1 个答案:

答案 0 :(得分:3)

您是否启用了深度测试?我看到你正在清除深度缓冲区,所以我怀疑可能,但你正在绘制与第一个完全相同深度的第二个纹理。使用glDepthFunc默认值GL_LESS会导致第二次抽奖被完全拒绝。

或者你想如何将这两个联合组合起来?是否应该进行一些混合?