VBO и glTranslatef нужно ли умножить gl_vertex в шейдере GLSL на что-нибудь?

У меня есть VBOs, чтобы разделить мой мир, как в игре Diablo. Раньше я сам устанавливал данные вершин в точную позицию в мире, но с ростом позиции росли и математические ошибки с плавающей точкой.

Теперь я изменил его так, чтобы данные вершин относились к 0,0,0, и я использую glTranslatef, чтобы установить каждое VBO в правильное положение вокруг игрока.

glPushMatrix();
glTranslatef(m_X, m_Y, m_Z);
draw VBO
glPopMatrix();

Это делает так, что позиции X и Z игрока всегда находятся в диапазоне 0-512(физический размер 1 VBO), и когда они покидают его, мир меняет противоположный путь. Это работает хорошо и исправляет ошибки с плавающей запятой, однако оно внесло новую ошибку.

В моем шейдере я создаю эффект, похожий на волнообразную волну, беря cos/sin положений X и Z вершины, умноженных на переменную времени, и изменяю положение Y вместе с ними.

uniform float timeVar;
...
vec4 v = vec4(gl_Vertex);
v.y += (sin(v.x+timeVar*2)+cos(v.z+timeVar))*2-5;
...
gl_Position = gl_ModelViewProjectionMatrix * v;

Это работало, когда позиции вершин были точными, но теперь я подозреваю, что они находятся в диапазоне 0-512, поскольку это то, к чему они все настроены, прежде чем я перевожу их на их фактические позиции. Это заставляет волны все еще появляться, но теперь на краях VBO, вода отделена, так как cos(0)!= Cos(512).

Что мне нужно сделать в шейдере, чтобы получить реальное положение вершины в мире?

1 ответ

Решение

Пройдите в мировом положении как униформу.

Другие вопросы по тегам