opengl纹理坐标如何工作?

时间:2011-04-03 21:17:00

标签: opengl

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

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

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

4 个答案:

答案 0 :(得分:114)

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

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

enter image description here @ b1nary.atr0phy所有视觉思考者的形象!

答案 1 :(得分:9)

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

取一个多边形,将其视为一张纸。有了这个:

glTexCoord(0,0); 
glTexCoord(0,1); 
glTexCoord(1,1); 
glTexCoord(1,0); 

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:3)

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

上传图片时也很有趣:

  

8.5.3纹理图像结构

     

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

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