Теневое отображение OpenGL, кадровый буфер с несколькими glDrawElements

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

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

сцена нарисована как надо.

0

Другие решения


По вопросам рекламы [email protected]