opengl纹理坐标如何工作?

mk.*_*mk. 57 opengl

我知道在每次调用glVertex之前我必须调用以下其中一个:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 
Run Code Online (Sandbox Code Playgroud)

但我不知道他们的意思.但是,我知道,如果我乘以(或者是那个除法?)右侧(或者它是所有的?)两个,我的纹理会扩展,如果我相反,我的纹理会重复两次.我已经设法通过应用操作来编码纹理图集,直到它工作.但我对正在发生的事情有充分的了解.为什么划分它们会影响图像,为什么反转它们会反映它?纹理坐标如何工作?

geo*_*tnz 124

纹理坐标指定纹理图像中与您为其指定的顶点对应的点.想象一下印有纹理图像的矩形橡皮布,每边的长度标准化为0-1.现在让我们假设您想使用该纹理绘制三角形.你需要3针并将它们放在橡胶板上每个所需纹理坐标的位置.(说[0,0],[1,0]和[1,1])然后将这些引脚(不带它们)移动到你想要的顶点坐标(Say [0,0],[0.5,0]和[ 1,1],使橡胶板伸展,图像变形.这基本上是纹理坐标的工作原理.

如果您使用大于1的纹理坐标并且您的纹理设置为重复,那么就好像橡胶板的大小无限并且纹理在其上平铺.因此,如果两个顶点的纹理坐标分别为0,0和4,0,那么图像必须在这些顶点之间重复4次.

在此输入图像描述 @ b1nary.atr0phy所有视觉思想家的形象!

  • [所有视觉思想家的形象](http://i.stack.imgur.com/l8Ohw.png) (25认同)
  • 引脚类比很棒.我正在考虑在四边形上拉伸和移动纹理,而不是使用纹理坐标从纹理中"取样".谢谢. (4认同)
  • 我可能是错的,但对于webgl,纹理的原点位于左上角而不是左下角。我相信所有gls都是一样的。图片引起混乱。 (2认同)
  • @SwiftsNamesake 在我写那个答案时可能已经是真的了......我会去把它拿出来。 (2认同)

Cri*_*ina 9

OpenGL使用反向纹理.它采用从世界空间(X,Y,Z)到纹理空间(X,Y)到离散空间(U,V)的坐标,其中离散空间在[0,1]域中.

拿一个多边形,把它想象成一张纸.有了这个:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 
Run Code Online (Sandbox Code Playgroud)

你告诉OpenGL在整张纸上画画.应用修改时,纹理空间会相应地修改为给定坐标.这就是为什么例如当你划分两次得到相同的纹理时,你告诉OpenGL映射一半的纸张,而不是整张纸.


小智 6

红皮书的第9章详细解释了这一点,可在线免费获取.

http://www.glprogramming.com/red/chapter09.html

纹理坐标将x,y映射到宽度和高度纹理空间中的空间0-1.然后将其拉伸成三角形上的橡胶板.最好用图片解释,红皮书就是这样做的.


And*_*urg 5

对于 2D 图像纹理,纹理坐标中的 0,0 对应于图像的左下角,纹理坐标中的 1,1 对应于图像的右上角。注意,“图像的左下角”并不是位于左下像素的中心,而是位于该像素的边缘。

上传图片时也很有趣:

8.5.3 纹理图像结构

纹理图像本身(由数据引用)是一组值的序列。第一组是纹理图像的左下角。后续组从左到右填写宽度width的行;高度行从下到上堆叠形成单个二维图像切片;深度切片从后向前堆叠。

请注意,大多数图像格式的数据从顶部开始,而不是从底行开始。