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

时间:2013-07-02 10:02:10

标签: opengl grid mapping 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纹理。

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

1 个答案:

答案 0 :(得分:6)

  

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

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

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

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

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

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

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