在opengl中完美(3D)纹理映射

sci*_*pie 1 opengl mapping grid 3d-texture

我试图在opengl中创建一个简单的3D数组可视化.3D阵列包含颜色值.为了实现这一点,我可以绘制很多立方体,给它们纹理坐标指向正确的纹理像素.好吧,我试过了,它的确有效.但我需要更多,而实现我想要的唯一方法是,如果我只是在平面打开时在另一个轴方向上的每个网格上绘制完整的2D平面,并且这是6个方向.例如:我在-15到+15之间绘制XY平面,在Z坐标-15到+15之间绘制XY平面,对于背面XY平面,YZ平面,背面YZ平面,......这样,我可以在每个角落放置3D纹理坐标,插值应该完成其余的工作.

我已经将数组坐标作为纹理坐标,介于0和32之间,原因是,在着色器中,我可以将纹理坐标放下,然后将其除以32,以获得网格上每个像素的精确纹理像素.

但是唉...像素着色器一直在怀疑选择,一个像素映射到与下一个像素不同的纹理像素,而下一个像素着色器再次正确映射.

我曾经通过向浮点数添加0.5或0.35来解决这些问题,以确保浮点数在所有硬件平台上都能正确舍入,但对我来说这似乎仍然是一个黑客攻击.此外,它不适用于3D纹理.

有谁能告诉我如何处理这个?

dat*_*olf 6

有谁能告诉我如何处理这个?

你正在遇到臭名昭着的围栏问题.简单来说,纹理坐标0和1不是像素中心,而是像素边界.看看这个简单的草图

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

  0   1   2   3   4
 --- --- --- --- ---
  4   4   4   4   4
Run Code Online (Sandbox Code Playgroud)

因此,要解决纹理N(比如4)像素宽的像素i(比如0),必须使用纹理坐标

(i/N + (i+1)/N)/2 = i/2N + (i+1)/2N = (2i + 1) / 2N = (i + 0.5)/N
Run Code Online (Sandbox Code Playgroud)

因此,添加0.5不是黑客.但是,在着色器中,您可以使用texelFetch绝对像素而不是采样坐标来处理纹理.但是,您必须自己实施过滤.