Я работаю над игрой в шахматы и реализацией некоторых графических алгоритмов в C ++ и OpenGL. Сейчас я работаю над отображением теней, рендеринг карты глубины в текстуру, все хорошо, пока я не вращаю мир.
Тень должна оставаться на «том же» месте на шахматной доске.
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.
Я пробовал неперспективно для переменных шейдеров … Вероятно, это проблема с матрицами, но я заблудился в этом: — /
Задача ещё не решена.
Других решений пока нет …