Повторяющиеся текстуры сильно искажаются/дрожат при повороте камеры

Я первоначально задал этот вопрос на gamedev, но ни один из ответов не помог решить проблему, и я до сих пор не знаю, в чем истинная причина. Я не видел ничего о повторном размещении вопросов на SE в FAQs, так что я могу только надеяться, что это нормально. Кроме того, в ретроспективе вопрос, вероятно, больше относится к программированию графики в целом, чем просто к разработке игр.

Редактировать 1 начало

Поведение в оригинальном посте применимо только к Windows XP и Windows 7, браузерам Firefox и Chrome. На Ubuntu такого искажения нет, но вместо этого текстуры "трясутся" при вращении камеры. Когда вращение останавливается, тряска прекращается, но текстуры могут находиться не в полностью правильном положении.

Редактирование 1 заканчивается

Редактирование 3 начинается

Программа была протестирована на 4 разных компьютерах, и ни на одном из них она не работала так, как было задумано.

Edit 3 ends

У меня есть большой воксель в WebGL, который я хочу покрыть плиточной текстурой, каждая плитка имеет длину стороны 1 в пространстве вершин. В этом тестовом сценарии камера направлена в отрицательном направлении z, а стороны вокселя находятся в плоскостях x-y, x-z, y-z.

Меньшие воксели (т.е. меньшее количество повторений) работают довольно хорошо, но при примерно 2000 повторений x и y на лицо (т.е. размер вокселя 2000*2000*2000) текстуры начинают выглядеть действительно уродливо. Когда камера направлена перпендикулярно лицу, текстуры выглядят правильно независимо от размера/количества повторений, но для вокселей вышеупомянутого размера любой поворот даже на пару градусов вызывает видимую проблему. Увеличение размера вокселя увеличивает искажение. Обратное тоже верно: с маленькими вокселями текстуры выглядят правильно независимо от поворота камеры. Мне кажется, что жесткого порогового значения для размера не существует, но эффект начинает постепенно увеличиваться от нуля при увеличении размера вокселя от примерно 2000 на сторону.

Смотрите http://imgur.com/a/spQIv для визуализации. Первое изображение показывает, как это должно выглядеть, но при повороте камеры линии начинают искажаться, как на втором изображении. Эффект ухудшается при увеличении размера вокселя и при большем повороте камеры. http://imgur.com/a/wRndy содержит два дополнительных изображения с более сильным эффектом.

Текстуры (по одному X на текстуру) изначально имеют размер 512*512 px. Скриншоты никак не масштабировались.

Моим первым предположением были неточности в плавании, но в это довольно трудно поверить, поскольку объект имеет размеры порядка 1000.

Моим вторым предположением была какая-то странная ошибка округления int/float, но поскольку все всегда обрабатывается в float, я не понимаю, как это могло произойти.

Третья возможность, о которой я могу подумать, это то, что это просто невозможно, и что текстуры не должны повторяться столько раз. Однако, это кажется весьма маловероятным IMO. Я предполагаю (и надеюсь), что это какая-то элементарная проблема.

Любые предложения о том, что может вызвать или обычно вызывает подобное, будут высоко оценены, потому что, похоже, мне очень трудно самостоятельно определить источник этой проблемы.

Я использую:

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);
gl.generateMipmap(gl.TEXTURE_2D);

и в шейдере:

#ifdef GL_ES
precision highp float;
#endif

Я также выполнил несколько очень элементарных вычислений: Для 32-битных плавающих чисел максимальный знаковый разряд составляет около 8,4 миллиона. Для длины стороны вокселя 2000 (я заметил, что именно на этом уровне эффект стал заметен) можно было бы наивно ожидать примерно 0,00025 плавающей ошибки округления координат. Если предположить, что каждый повтор занимает около 100 пикселей на экране, то ошибка должна быть значительно меньше 1 пикселя, чего не происходит. Если только мои расчеты выше не были сделаны неправильно, поэтому я бы утверждал, что Float32 не виноват, и что причина должна быть где-то еще.

Линейная текстура используется только для визуализации проблемы. Проблема сохраняется и с другими (более естественными) видами текстур.

Редактирование 2 начинается

Включение или отключение сглаживания не дает видимой разницы

Редактирование 2 заканчивается

6
задан Community 13 April 2017 в 12:18
поделиться