2013-07-02 100 views
1

我想在opengl中创建一个简单的3D数组可视化。 3D阵列包含颜色值。 为了达到这个目的,我可以画出许多立方体,给它们纹理坐标以指向正确的纹理元素。那么,我试了一下,它的工作原理。 但是我需要更多的东西,并且实现我想要的唯一方法是在平面打开时,如果我在其他轴方向上的每个网格上绘制完整的2D平面,并且这是6个方向。因此,例如:我在-15到+15之间绘制了XY平面,在Z-坐标-15到+15上绘制了XY平面,并且这也适用于后XY平面,YZ平面,后YZ平面.. 这样,我可以在每个角落都放上3D纹理坐标,而插值应该完成剩下的工作。opengl中的完美(3D)纹理映射

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

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

我用来解决这些类型的问题,加入0.5或0.35至彩车,以确保在花车所有硬件平台上正确的舍入,但它似乎仍然这样一个黑客给我。此外,它不适用于3D纹理。

谁能告诉我如何处理?

回答

6

谁能告诉我该如何处理呢?

您正在进入臭名昭着的fenceposting问题。简单地说,纹理坐标0和1不是像素中心,而是像素边界。看看这个简单的草图

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

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

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

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

所以补充说0.5不是黑客。但是在着色器中,您可以仅使用texelFetch来解决绝对像素中的纹理,而不是采样坐标。但是,你必须实现过滤自己。

+1

特别是你的texelFetch选项是非常有帮助的。我实际上并不知道它存在,并且一直在想,为什么没有TEXTURE RECT风格的1D和3D纹理版本。 – scippie