我有一个由许多对象组成的场景,当我渲染它们时,我会迭代场景中的所有项目,并对它们调用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);当我只在山体对象上运行它时,这是我得到的结果图像,你可以看到它是正确的。

它也可以单独处理其他场景元素。我的问题是,如何使用多次绘制无问题地绘制到同一缓冲区中?
编辑:只是因为这里需要阴影着色器组件:
顶点着色器:
#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()
{
}发布于 2014-04-27 11:33:39
我不知道为什么,但是当台词,
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);场景按其应有的方式绘制。
https://stackoverflow.com/questions/23318751
复制相似问题