假设我的图片尺寸 320x240 。现在,从sampler2D
采样整数图像坐标ux, uy
我必须对 [0,尺寸] 范围内的纹理坐标进行标准化(尺寸可以是宽度或高度)。
现在,我想知道我是否应该像这样正常化
texture(image, vec2(ux/320.0, uy/240.0))
或者像这样
texture(image, vec2(ux/319.0, uy/239.0))
因为 ux = 0 ... 319 且 uy = 0 ... 239 。后者实际上会涵盖 [0,1] 的整个范围吗?这意味着 0 对应于例如最左边的像素和 1 对应于最右边的像素,对吧?
我还想保持过滤,所以我不想使用texelFetch
。
有人可以讲一些这个吗?感谢。
答案 0 :(得分:1)
无论像素有多少,纹理坐标(和像素坐标)在像素的边缘都从0变为1。
4像素宽的纹理
s2
5像素宽的纹理
0 0.5 1 <- texture coordinate
| | |
V V v
+-----+-----+-----+-----+
| | | | |
| | | | | <- texels
+-----+-----+-----+-----+
6像素宽的纹理
0 0.5 1 <- texture coordinate
| | |
V V v
+-----+-----+-----+-----+-----+
| | | | | |
| | | | | | <- texels
+-----+-----+-----+-----+-----+
1像素宽的纹理
0 0.5 1 <- texture coordinate
| | |
V V V
+-----+-----+-----+-----+-----+-----+
| | | | | | |
| | | | | | | <- texels
+-----+-----+-----+-----+-----+-----+
如果您为每个纹理坐标使用 0 0.5 1 <- texture coordinate
| | |
V V V
+-----+
| |
| | <- texels
+-----+
,则会得到这些坐标
u = integerTextureCoordinate / width
这些坐标直接指向纹理像素之间。
但是,如果要处理特定纹理像素,则需要的纹理坐标就像这样
0 0.25 0.5 0.75 <- u = intU / width;
| | | |
V V V V
+-----+-----+-----+-----+
| | | | |
| | | | | <- texels
+-----+-----+-----+-----+
您从哪里得到
0.125 0.375 0.625 0.875
| | | |
V V V V
+-----+-----+-----+-----+
| | | | |
| | | | | <- texels
+-----+-----+-----+-----+
答案 1 :(得分:-1)
不,第一个实际上是正确的:
^Q
你的前提是&#34; ux = 0 ... 319和uy = 0 ... 239&#34;是不正确的。如果你渲染一个320x240四边形,比方说,那么它实际上是ux = 0 ... 320和uy = 0 ... 240。
这是因为像素和纹素是在半整数坐标处采样的正方形。因此,例如,让我们假设您在320x240四边形上渲染320x240纹理。然后,实际上将在屏幕坐标(.5,.5)处对左下像素(0,0)进行采样。您可以通过除以(320,240)对其进行标准化,但是然后OpenGL会将标准化坐标乘以(320,240)以获得实际的纹素坐标,因此它将从纹理中采样(.5,.5),这对应于中心(0,0)像素,返回其确切的颜色。
将OpenGL中的像素视为正方形非常重要,因此坐标(0,0)对应于左下角像素的左下角和非标准化(w,h)对应于右上角像素的右上角(对于大小(w,h)的纹理)。