1

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

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

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

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

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

4

1 回答 1

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 不是 hack。但是在着色器中,您可以只使用texelFetch绝对像素来处理纹理,而不是采样坐标。但是,您必须自己实现过滤。

于 2013-07-02T10:14:23.097 回答