2

要約すると、私のフルスクリーンシェーダーは何も出力していません。

GLSLで遅延シェーダーを作成していて、画面スペースにライトを適用する段階に到達しました。基本的にGBufferからデフォルトのFBOに拡散強度を書き込むアンビエントパスがありますが、これは正常に機能します。次に、別のフルスクリーンクワッドを適用してシーン内の指向性ライトを計算します。これもGBUfferからのサンプルであり、デフォルトのFBOとブレンドする必要があります。

私が抱えている問題は、指向性ライトシェーダーが何も出力しないことです。アンビエントパスで使用するのと同じ行列と変換を使用しますが、何も変更されません。

私は以下を試しました。

  1. アンビエントパスのすべてのフラグメントで同じ色を出力して、出力されていることを確認します。(作品)
  2. 指向性ライトパスのすべてのフラグメントで同じ色を出力します。(それでも何も得られない)
  3. 正規化された座標ではなく、XY頂点座標の画面解像度を使用します。
    • 結果が期待どおりに変化するのを見ることができるので、これはアンビエントパスで機能します。
    • 指向性ライトパスでは何も変化せず、同じ出力が得られます。
  4. アンビエントシェーダーを通常のバッファーまたは位置バッファーからサンプリングするように変更して、テクスチャを(作業中)からサンプリングできるようにします。

これがアプリケーションコードです。

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

計算が間違っている場合は失礼します。シェーダーをいじってあらゆる種類の出力を取得しようとしていますが、ここにシェーダーのソースファイルがあります。

<-direction_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);
}

<-direction_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
}

<-ambient.vert->

varying out vec2 ScreenPos;

void main()
{
    gl_Position = gl_Vertex;

    // Used for the position to sample from GBuffer
    ScreenPos = gl_MultiTexCoord0.st;
}

<-ambient.frag->

// 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);
}
4

1 に答える 1

3

深度テストを有効にしていますか?デプスバッファをクリアしているようですので、おそらくそうですが、2番目のテクスチャを最初のテクスチャとまったく同じ深さで描画しています。glDepthFuncデフォルトでは、GL_LESS2回目の抽選は完全に拒否されます。

それとも、2つのドローをどのように組み合わせるのですか?いくつかのブレンドが含まれる必要がありますか?

于 2012-04-15T19:28:38.223 に答える