如何在OpenGL中规范化纹理空间的图像坐标?

时间:2016-11-13 14:04:47

标签: opengl glsl textures texture-mapping

假设我的图片尺寸 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

有人可以讲一些这个吗?感谢。

2 个答案:

答案 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)的纹理)。