Мой код создает сетку из множества вершин и затем смещает их по произвольному значению шума по высоте в вершинном шейдере. Перемещение с использованиемПеремещение вершин в вершинном шейдере
glTranslated(-camera.x, -camera.y, -camera.z);
прекрасно работает, но это будет означать, что вы можете идти до края сетки.
Я подумал о том, чтобы поместить положение камеры в шейдер и позволить смещению целиком смещаться. Таким образом, окончательный код вершинного шейдера:
uniform vec3 camera_position;
varying vec4 position;
void main()
{
vec3 tmp;
tmp = gl_Vertex.xyz;
tmp -= camera_position;
gl_Vertex.y = snoise(tmp.xz/NOISE_FREQUENCY) * NOISE_SCALING;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
position = gl_Position;
}
EDIT: Я исправил недостаток, вершины сами не должны получить горизонтально перемещенными.
По какой-то причине, когда я запускаю это и меняю положение камеры, экран мерцает, но ничего не движется. Вершины смещены по значению шума правильно, а окраска и все работает, но смещение не движется.
Для справки, вот репозиторий: https://github.com/Orpheon/Synthworld
Что я делаю неправильно?
PS: «Мерцание» неверно. Кажется, что с некоторыми позициями он ничего не рисует, а другие рисуют нормальную сцену с позиции 0, поэтому, если я двигаюсь, не останавливаясь, она мерцает. Я могу остановиться в месте, где он остается черным, или в том месте, где он остается нормальным.
Я дам вам щедрость, если вы также * объясните * ошибку и исправление. – Medo42
Вещь, я даже не совсем понимаю ошибку. Я изменил команду. Раньше я использовал команду, которая непосредственно передает поплавки, и сделала какую-то ошибку. Исправить, для меня, было переключиться на команду, которая просто передала указатель на массив (glUniform3fv вместо glUniform3f). Это просто сработало. Так что да, извините. – Orpheon