为什么可能会遇到大于1或小于0的纹理坐标


11

我正在研究有关文本texture mapping,在preparing to draw会议中,我读到:

定义纹理包裹参数。这将控制在遇到纹理坐标大于1.0或小于0.0时发生的情况:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap);  
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap);  

其中wrap是:
GL_REPEAT:指定如果遇到转换的纹理坐标小于0.0或大于1.0的情况,此模式将重复(即环绕)。

GL_CLAMP:指定模式将“固定”为0.0或1.0的值。

但是没有任何解释遇到这种纹理坐标的原因是什么?
例如,假设我刚刚绘制了一个矩形,并且想在其上应用图像作为纹理,是否有可能遇到这样的坐标?

Answers:


5

并非所有的纹理都使用来自网格数据的纹理坐标。例如,使用投影纹理,您可以将世界转换为纹理空间。好吧,这个世界中的许多都超出了纹理的[0,1]范围。没有适当的夹紧模式,您将遇到问题。


10

精确地重复纹理。

因此,如果您有一个四边形,并且纹理坐标从0变为1,则纹理将绘制一次。如果坐标从0到2且将wrap设置为GL_REPEAT,则纹理将绘制两次。

试试看,自己看看


好的@Panda Pajama,这样的代码如下:float x0 = 0; //图片浮点数y0 = 0的左上角;浮点数x1 = x0 + ImageWidth; //图片浮动量的右下角y1 = y0 + ImageHeight; glBegin(GL_TRIANGLE_STRIP); {glTexCoord2f(0,1); glVertex2f(x0,y1); glTexCoord2f(0,0); glVertex2f(x0,y0); glTexCoord2f(1,1); glVertex2f(x1,y1); glTexCoord2f(1,0); glVertex2f(x1,y0); }是否有可能遇到超出间隔(0,1)的纹理坐标?
— Sepideh Abadpour

1
@sepideh:当然不是。您专门将纹理坐标保持在[0,1]范围内。您不了解的是,您不必这样做;你本可以做成任何东西。另外,不要在注释中发布一堆代码。如果您想澄清,请编辑您的问题。
— Nicol Bolas

好的,感谢您提供有关将代码传递给我的问题的指导。我正在寻找一种格式化命令中的代码的方法,但是找不到!!!因此,您的意思是遇到这样的坐标不是运行时可能发生的事件。程序员只是清楚地指定了它,以重复或不重复纹理。
— Sepideh Abadpour

1
@sepideh“不是运行时可能的事件”是什么意思?glTexCoord2f(0, 2);例如,更改注释中的代码是完全可以的。这在代码和程序运行时都有非常明确的定义。如果看到此消息,则表明程序员有意进行了此操作,因为它可以提供所需的结果。
— 约瑟夫·曼斯菲尔德

2
@sepideh当然。OpenGL使用您提供的任何值。如果您给它的值在0到1的范围内,您将一无所有。
— 约瑟夫·曼斯菲尔德

5

是的,您可能会遇到大于1.0和小于的纹理坐标0.0。

这完全取决于您加载的模型。通常,对于每个顶点,都会存储位置,法线和纹理坐标。在大多数网格文件格式中,纹理坐标不限于任何范围。

这用于重复纹理。例如,跨越顶点的四间纹理四个时间,纹理坐标将是0,0,0,4,4,0和4,4。没有纹理包裹,你就需要更多的顶点到地面4个面,每个纹理坐标分成4倍0,0,0,1,1,0,1,1。较少的顶点可导致更好的渲染性能。

通常,不希望使用者注意到重复纹理的边缘。因此,在大多数情况下,重复纹理是可平铺的。意思是,右边缘无缝地淡入左边缘,而上边缘无缝地淡入底部。这样,过渡是平滑的,希望用户不会注意到。

一个更高级但相关的主题是,巧妙地掩盖相同纹理多次重复的事实。例如,混合不同大小的重复纹理,例如墙壁纹理和污垢贴花,是一种常见的技术。


Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1那是一些实际的解释!谢谢!
— 阿米特·托玛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.