3

アプリケーションでシャドウ マッピングを機能させることができません。四輪バイクをレンダリングして、その下の床に影を表示してみます。これが私のコードの一部です。テクスチャの作成:

    // Create a depth texture
    glGenTextures(1, &depth_texture);
    glBindTexture(GL_TEXTURE_2D, depth_texture);
    // Allocate storage for the texture data
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32 ,1600, 900, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    // Set the default filtering modes
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    // Set up wrapping modes
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glBindTexture(GL_TEXTURE_2D, 0);
    // Create FBO to render depth into
    glGenFramebuffers(1, &depth_fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, depth_fbo);
    // Attach the depth texture to it
    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
    depth_texture, 0);
    // Disable color rendering as there are no color attachments
    glDrawBuffer(GL_NONE);
    //check fbo status
    GLenum result = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(result != GL_FRAMEBUFFER_COMPLETE)
        throw std::runtime_error("shadow mapping framebuffer error");
    //bind default framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

深度テクスチャにレンダリング:

progShadow.Use();
glBindFramebuffer(GL_FRAMEBUFFER, depth_fbo);

glClear(GL_DEPTH_BUFFER_BIT);

glm::mat4 shadowProjection = glm::frustum(-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 100.0f);
glm::mat4 shadowView = glm::lookAt(light.position, glm::vec3(0,0,0), glm::vec3(0,1,0));
glm::mat4 shadowModel(1);
if(g_rotate)
    shadowModel = glm::rotate((float)clock() / (float)CLOCKS_PER_SEC, glm::vec3(0,1,0));
glm::mat4 shadowMVP = shadowProjection * shadowView * shadowModel;
progShadow.SetUniform("MVPMatrix", shadowMVP);
quadBike.Draw();

また、深度テクスチャをレンダリングする「テスト」シェーダー プログラムも使用します。これがどのように見えるかです。 画像

だから今までで良かったと思います。これで、シーンを通常どおりにレンダリングします。

glBindTexture(GL_TEXTURE_2D, depth_texture);
prog.Use();//main program
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glm::mat4 shadowBias = glm::mat4(0.5, 0.0, 0.0, 0.0,
                                 0.0, 0.5, 0.0, 0.0,
                                 0.0, 0.0, 0.5, 0.0,
                                 0.5, 0.5, 0.5, 1.0);
glm::mat4 ShadowBiasMVP = shadowBias * shadowMVP;
prog.SetUniform("ShadowBiasMVP", ShadowBiasMVP);

//draw quadBike and floor
...

私の頂点シェーダーの関連部分:

#version 430

...

out vec4 shadowCoord;

void main()
{
    gl_Position = ProjectionMatrix * CameraMatrix * ModelMatrix * vec4(vertex, 1.0);
    shadowCoord = ShadowBiasMVP * vec4(vertex, 1.0);
    ...
}

私のフラグメントシェーダーの関連部分:

#version 430

...

uniform sampler2D shadowMap;
in vec4 shadowCoord;

void main()
{
    ...

    float visibility = 1.0;
    if ( texture(shadowMap, shadowCoord.xy).z <  shadowCoord.z)
        visibility = 0.0;

    ...
}

ここでの問題は、すべてが影に覆われているかのように、完全に暗いシーンが得られることです。ライトが四輪バイクに非常に近い場合にのみ、正常にレンダリングされます。(別のプログラムでレンダリングされているため、右側に深度テクスチャが表示されます。テストに使用します) シーン

私は何を間違っていますか?

4

1 に答える 1