关于OpenGL纹理坐标

0h4hbjxa  于 2022-11-04  发布在  其他
关注(0)|答案(4)|浏览(188)

我知道必须在每次调用glVertex之前调用以下内容之一:

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

但我不知道它们是什么意思。我知道,然而,如果我乘(或者说是分界线?)右边(或者是所有的那些?)到2,我的纹理就会膨胀,如果我反其道而行之,我的纹理重复了两次。我设法通过应用操作来编码纹理Map,直到它工作为止。但我对发生了什么完全不知道。为什么分割这些坐标会影响图像,为什么反转它们会镜像图像?纹理坐标是如何工作的?

zkure5ic

zkure5ic1#

纹理坐标指定纹理图像中的点,该点将与您为其指定坐标的顶点相对应。设想一个矩形橡胶板,上面打印有您的纹理图像,其中每条边的长度被标准化为0-1的范围。现在假设你想用这个纹理画一个三角形。你'd取3个大头针,将它们放在橡皮布上你想要的纹理坐标的位置。(说[0,0]、[1,0]和[1,1])然后移动这些引脚(不取出)到你想要的顶点坐标(比如[0,0],[0.5,0]和[1,1]),这样橡胶片就被拉伸了,图像也被扭曲了。这就是纹理坐标的基本工作原理。
如果使用大于1的纹理坐标,并且纹理设置为重复,那么就好像海绵片的大小是无限的,并且纹理平铺在海绵片上。因此,如果两个顶点的纹理坐标是0,0和4,0,那么图像必须在这两个顶点之间重复4次。


@b1nary.atr0phy图片给所有的视觉思考者!

4nkexdtk

4nkexdtk2#

OpenGL使用反向纹理,它将坐标从世界空间(X,Y,Z)到纹理空间(X,Y)再到离散空间(U,V),其中离散空间在[0,1]域中。
取一个多边形,把它想象成一张纸。用这个:

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

你告诉OpenGL在整张纸上绘制。当你应用修改时,你的纹理空间会根据给予的坐标进行修改。这就是为什么当你把同一个纹理分割两次时,你告诉OpenGLMap你的半张纸,而不是整张纸。

u2nhd7ah

u2nhd7ah3#

红皮书第9章详细解释了这一点,并可在网上免费获得。
http://www.glprogramming.com/red/chapter09.html
纹理坐标将x,yMap到宽度和高度纹理空间中的0-1空间。然后像橡胶片一样在三角形上拉伸。最好用图片来解释,红皮书就是这样做的。

lg40wkob

lg40wkob4#

对于2D图像纹理,纹理坐标中的0,0对应于图像的左下角,纹理坐标中的1,1对应于图像的右上角。注意,“图像的左下角”不是在左下像素的中心,而是在像素的边缘。
上传图像时也很有趣:
8.5.3纹理图像结构
纹理图像本身(被数据引用)是一组值的序列,第一组是纹理图像的左后下角,后续的组从左到右填充宽度为width的行;从底部到顶部堆叠高度行,形成单个二维图像切片;和深度切片从后到前堆叠。
请注意,大多数图像格式的数据都从顶部开始,而不是从底部行开始。

相关问题