Неправильные координаты текстуры от FBO

Я работаю над игрой в шахматы и реализацией некоторых графических алгоритмов в C ++ и OpenGL. Сейчас я работаю над отображением теней, рендеринг карты глубины в текстуру, все хорошо, пока я не вращаю мир.

testunrotate
testyrotation
testxrotation

Тень должна оставаться на «том же» месте на шахматной доске.

GLFrame objectFrame
GLFrame cameraFrame;
GLFrame lightFrame;
GLFrame mirrorFrame;
GLFrustum viewFrustum;
M3DMatrix44f mCamera;
M3DMatrix44f mObjectFrame;
M3DMatrix44f lightView;

GLuint FBO;
glGenFramebuffersEXT(1, &FBO);
shared->setShadowMapFBO(FBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO);

GLuint shadowMapTex;
glGenTextures(1, &shadowMapTex);
glBindTexture(GL_TEXTURE_2D, shadowMapTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, TEX_WIDTH, TEX_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, shadowMapTex, 0);

glEnable(GL_CULL_FACE); glCullFace(GL_BACK);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, FBO);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glViewport(0, 0, TEX_WIDTH, TEX_HEIGHT);
viewFrustum.SetPerspective(90, (float)TEX_WIDTH/TEX_HEIGHT, NEAR, FAR);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
modelViewMatrix.PushMatrix();

lightFrame.GetCameraMatrix(lightView);
modelViewMatrix.MultMatrix(lightView);
objectFrame.GetMatrix(mObjectFrame);
modelViewMatrix.MultMatrix(mObjectFrame);

shared->setShadowMapMVP(shared->getPipeline()->GetModelViewProjectionMatrix());
shared->getChessboard()->draw(true);
modelViewMatrix.PopMatrix();
glDisable(GL_CULL_FACE);

glBindFramebuffer(GL_DRAW_FRAMEBUFFER_EXT, 0);
glColorMask(true, true, true, true);
glViewport(0, 0, shared->getWidth(), shared->getHeight());
viewFrustum.SetPerspective(FRUSTUM_ANGLE, (float)shared->getWidth()/shared->getHeight(), NEAR, FAR);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
modelViewMatrix.PushMatrix();
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
objectFrame.GetMatrix(mObjectFrame);
modelViewMatrix.MultMatrix(mObjectFrame);
shared->getChessboard()->draw(false, true, false, false);

функция вращения

objectFrame.RotateWorld(m3dDegToRad(ROTATION_ANGLE), 1.0f, 0.0f, 0.0f);

вершинный шейдер

uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat4 shadowMaptMvp;

in vec4 vVertex;

out vec4 lightViewPos;

void main(void)
{
gl_Position = mvpMatrix * vVertex;
lightViewPos = shadowMapMvp * vVertex;
lightViewPos.xyz = lightViewPos.xyz / lightViewPos.w;
}

и фрагмент шейдера

uniform sampler2D depthMap;

in vec4 lightViewPos;

out vec4 fragColor;

void main(void)
{
if(texture2D(depthMap, vec2(lightViewPos.x * 0.5 + 0.5, lightViewPos.y * 0.5 + 0.5)).x < (lightViewPos.z * 0.5 + 0.5))
fragColor = vBlack;
}

Некоторые части (нормальная текстура …) обрезаны, поэтому я надеюсь, что здесь есть все, что может создать проблему. То же самое происходит, когда я пытался реализовать отражение, используя FBO-> texture.

Я использую программный рендер Gallium 0.4 из Mesa 8.0.5 (OpenGL 2.1, GLSL 1.30) под Debian и некоторые библиотеки из пакета GLTools.

Я пробовал неперспективно для переменных шейдеров … Вероятно, это проблема с матрицами, но я заблудился в этом: — /

1

Решение

Задача ещё не решена.

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

Других решений пока нет …

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