Примечание. Это вопрос, вставленный в копию Stack Exchange пару лет назад, но он так и не был решен, и у меня возникла точно такая же проблема, и наш код практически идентичен, так как я думаю, что мы следовали одному и тому же руководству,Я чувствую, что это проблема с используемыми матрицами, но я не уверен, какой из них или как это исправить.
https://gamedev.stackexchange.com/questions/138306/opengl-water-reflection-seems-to-follow-camera-yaw-and-pitch
Я пытаюсь добавить отражающую воду в мойпроцедурный рельеф.Я дошел до точки, которая, кажется, отражает, однако, когда я перемещаю камеру влево / вправо / вверх / вниз, отражения перемещаются вместе с ней.
Я считаю, что проблема как-то связана с тем, как яконвертировать из мирового пространства в пространство клипов для проекционного наложения текстур.
Вот изображение того, что происходит.https://imgur.com/rtUJt79
Вершинный шейдер
#version 400
in vec4 vPosition;
out vec4 clipSpace;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
void main ()
{
clipSpace = projection * view * model * vec4(vPosition.x, 0.0, vPosition.z, 1.0);
gl_Position = clipSpace;
}
Фрагментный шейдер
#version 400
in vec4 clipSpace;
out vec4 frag_colour;
uniform sampler2D reflectionTexture;
void main ()
{
vec2 ndc = (clipSpace.xy / clipSpace.z) / 2.0 + 0.5;
vec2 reflectTexCoords = vec2(ndc.x, -ndc.y);
vec4 reflectColour = texture(reflectionTexture, reflectTexCoords);
frag_colour = reflectColour;
}
Я использую этот код для перемещения камеры под поверхностью воды, чтобы получить отражение
float distance = 2 * (m_camera->GetPosition().y - m_water->GetHeight());
m_camera->m_cameraPosition.y -= distance;
m_camera->m_cameraPitch = -m_camera->m_cameraPitch;
Если этого кода недостаточно для диагностики проблемы, я выложу больше.Я пытался сохранить это до того, что, как я думал, могло быть проблемой.