OpenGL阴影映射,具有多个glDrawElements的帧缓冲区

时间:2014-04-27 02:35:45

标签: c++ opengl textures framebuffer shadow-mapping

我有一个由很多对象组成的场景,当我渲染它们时,我遍历场景中的所有项目并在它们上面调用glDrawElements。这很好用。但是,现在我正在实现阴影映射到场景,我使用相同的方式绘制到阴影缓冲区。但是,只有场景中的第一个元素以正确的方式被绘制到纹理中,我通过将深度纹理附加到您将在下面看到的场景元素来检查它。

代码如下:

glBindFramebuffer(GL_FRAMEBUFFER, vFrameBuffers[ShadowFB]);
glViewport(0,0,1024,1024);

glClearDepth(1.0f);
glClear(GL_DEPTH_BUFFER_BIT);

glUseProgram(shadowShader);
depth_loc = glGetUniformLocation(shadowShader, "depthProj");
model_view_loc = glGetUniformLocation(shadowShader, "modelmat");

glUniformMatrix4fv(depth_loc, 1, GL_FALSE, depthproj);

depthproj = mat4(1.0);
depthproj = Ortho(-250.0f, 250.0f, -200.0f, 200.0f, -200.0f, 200.0f);
depthproj = depthproj * RotateX(15);
depthproj = depthproj * RotateY(220);

for (int i = 0; i < _objectArray.size(); i++)
{
    modelmat = mat4(1.0);
    modelmat = modelmat*Translate(_objectArray[i]->getLocation()->getX(),
        _objectArray[i]->getLocation()->getY(),
        _objectArray[i]->getLocation()->getZ());

    glUniformMatrix4fv(model_view_loc, 1, GL_FALSE, modelmat);

    if (_objectArray[i]->getType() == TypeMountain)
    {
        glBindVertexArray(vArrays[ShadowMountainA]);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vElements[ShadowMountainE]);
        glDrawElements(GL_TRIANGLES, 40*40*6, GL_UNSIGNED_SHORT, NULL);
        glBindVertexArray(0);
    }
    else if (_objectArray[i]->getType() == TypePasture)
    {   
        glBindVertexArray(vArrays[ShadowPastureA]);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vElements[ShadowPastureE]);
        glDrawElements(GL_TRIANGLES, 40*40*6, GL_UNSIGNED_SHORT, NULL);
        glBindVertexArray(0);
    }
    else if (_objectArray[i]->getType() == TypeWater)
    {   
        glBindVertexArray(vArrays[ShadowWaterA]);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vElements[ShadowWaterE]);
        glDrawElements(GL_TRIANGLES, 40*40*6, GL_UNSIGNED_SHORT, NULL);
        glBindVertexArray(0);
    }
    else if (_objectArray[i]->getType() == TypeTree)
    {   
        glBindVertexArray(vArrays[ShadowTreeA]);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vElements[ShadowTreeE]);
        glDrawElements(GL_TRIANGLES, 180, GL_UNSIGNED_SHORT, NULL);
        glBindVertexArray(0);
    }
}

glUseProgram(0);

当我只在山体上运行它时,这是我得到的结果图像,因为你可以看到它是正确的。 Mountain in framebuffer 它也适用于其他场景元素。 我的问题是如何使用多次绘制在没有问题的情况下绘制到同一个缓冲区中?

编辑: 仅仅因为这里要求的是阴影着色器组件:

顶点着色器:

#version 330 core

uniform mat4 depthProj;
uniform mat4 modelmat;

layout(location = 0) attribute vec4 vPosition;

void main()
{
    gl_Position = depthProj * modelmat * vPosition;
}

片段着色器:

#version 330 core

layout(location = 0) out float fragmentDepth;

void main()
{
}

1 个答案:

答案 0 :(得分:0)

我不知道为什么,但是当行,

glUniformMatrix4fv(depth_loc, 1, GL_FALSE, depthproj);

glUniformMatrix4fv(model_view_loc, 1, GL_FALSE, modelmat);

变成了;

glUniformMatrix4fv(depth_loc, 1, GL_TRUE, depthproj);

glUniformMatrix4fv(model_view_loc, 1, GL_TRUE, modelmat);

场景按原样绘制。