У меня есть сцена, которая состоит из множества объектов, и когда я их рендеринг, я перебираю все элементы в сцене и вызываю на них 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()
{
}
Я не знаю почему, но когда линии,
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);
сцена нарисована как надо.