2013-02-06 120 views
1

我想在openGL中使用纹理进行并行计算(openCL不是一个选项)。我知道从左下角的每个轴上的域为0.0到1.0。但是,在将像素映射到像素的左上角还是像素的中间时,像素的坐标是?openGL像素坐标

Ex。如果我有一个100x100px的纹理。是最左上角像素的坐标(0.0,1.0)还是(0.005,0.995)?我认为这是前者,但一直在获得一些意想不到的结果。我在想,如果我正在访问“像素边界”上的数据,并且openGL将插值到一个将两个相邻像素平均的值。

+1

您可以使用'GL_NEAREST' [关闭过滤](http://www.opengl.org/wiki/Sampler_Object#Filtering)。 –

+1

关闭过滤不能解决fencepost问题。 – datenwolf

+1

我没有回答这个问题,已经在这里: http://stackoverflow.com/a/5879551/524368 [OpenGL的纹理坐标在像素空间(的 – datenwolf

回答

4

OpenGL像素/片段概念上是以半整数像素为中心的1x1正方形。 OpenGL 4.5规范指出:

片段位于其左下角,位于整数 网格坐标上。光栅化操作还涉及片段的中心,它从左下角偏移(1/2,1/2)(并且 因此位于半整数坐标上)。

因此,对于100x100像素,纹理元素之间的水平距离为1/100 = 0.01。因此左边缘和第一个文本中心之间的距离为0.01/2 = 0.005。

从左下角开始的第一个垂直纹理元素中心也是0.005,所以从顶部开始,第一个纹理元素中心为1.0 - 0.005 = 0.995。

这就是为什么你得到这些数字。

你可以看到my post here了解更多细节(tex坐标到最后)。

0

像素的中心实际上是后者,即(0.005,0.995)。

由于Nicol Bolas在评论中提到,您可以通过在创建纹理时将过滤方法更改为GL_NEAREST来防止在像素之间插值。