Идеальное (3D) наложение текстур в opengl

Я пытаюсь создать простую визуализацию 3D-массива в opengl. 3D-массив содержит значения цвета. Чтобы добиться этого, я мог бы просто нарисовать много кубов, дав им текстурные координаты, чтобы указать на правильный тексель. Ну, я попробовал, и это работает. Но мне нужно гораздо больше, и единственный способ добиться того, чего я хочу, - это просто нарисовать полные 2D-плоскости на каждой сетке в направлении другой оси, когда плоскость включена, и сделать это в 6 направлениях. Например, я рисую плоскость XY от -15 до +15, по координатам Z от -15 до +15, и делаю это также для задней плоскости XY, плоскости YZ, задней плоскости YZ,... Таким образом, я могу просто поместить координаты 3D-текстуры в каждом углу, а интерполяция должна сделать все остальное.

Я взял массив-координаты как текстурные координаты, между 0 и 32, причина этого в том, что в шейдере я могу перекрыть текстурную координату, а затем разделить ее на 32, чтобы получить точный тексель для каждого пикселя в сетке.,

Но увы... пиксельный шейдер постоянно сомневается в выборе, один пиксель сопоставляется с другим пикселем, отличным от следующего, в то время как следующий следующий пиксель корректно отображается снова.

Раньше я решал подобные проблемы, добавляя 0,5 или 0,35 к числам с плавающей точкой, чтобы убедиться, что числа с плавающей точкой правильно округлены на всех аппаратных платформах, но мне все равно это кажется взломом. Кроме того, он не работает с 3D-текстурой.

Может кто-нибудь сказать мне, как справиться с этим?

1 ответ

Решение

Может кто-нибудь сказать мне, как справиться с этим?

Вы сталкиваетесь с печально известной проблемой забора. Проще говоря, координаты текстуры 0 и 1 - это не центры пикселей, а границы пикселей. Посмотрите на этот простой набросок

  | 0 | 1 | 2 | 3 |
  ^               ^
 0.0             1.0

  0   1   2   3   4
 --- --- --- --- ---
  4   4   4   4   4

Поэтому для адресации пикселя i (скажем, 0) текстуры шириной N (скажем, 4) пикселя необходимо использовать координату текстуры.

(i/N + (i+1)/N)/2 = i/2N + (i+1)/2N = (2i + 1) / 2N = (i + 0.5)/N

Таким образом, добавив, что 0,5 не взломать. Однако в шейдере вы можете просто использовать texelFetch для адресации текстуры в абсолютных пикселях вместо координаты выборки. Однако вы должны реализовать фильтрацию самостоятельно.

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