更改GL_TEXTURE_WRAP)_(S / T)有什么作用?


12

我正在研究一些OpenGL初学者教程,而当前的教程则教如何将纹理应用于简单的矩形。教程中的状态告诉我将纹理参数GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T设置为GL_CLAMP_TO_EDGE,但是我不确定它的实际作用。我知道这与如何处理大于/小于被映射到的空间的纹理有关,但是我不确定这实际上会导致什么行为。GL_CLAMP_TO_EDGE有什么作用?与GL_CLAMP,GL_CLAMP_TO_BORDER,GL_REPEAT有何不同?在此先感谢您,如果可以为像我这样的白痴提供图片,请多加帮助。

Answers:


29

S和T仅表示U和V(或者,如果愿意,则表示X和Y),或者在GLSL中:

vec4.xyzw == vec4.rgba == vec4.strq

当您超过(0,0)至(1,1)范围时,GL_REPEAT模式将重复纹理

GL_CLAMP_TO_EDGE模式下,当您掉落边缘时,纹理会在最后一个像素处停止。

GL_CLAMP和GL_CLAMP_TO_BORDER已弃用,因为所有纹理边框都必须为0像素,因此这些模式不再有意义。(我相信在GL3附近)

还有更多模式,因此请务必阅读文档。(例如:GL_MIRRORED_REPEAT,GL_MIRROR_CLAMP_TO_EDGE)


http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml上有一些很好的示例,这里是预览:

换行S:GL_CLAMP /换行T:GL_CLAMP

夹钳

换行S:GL_CLAMP /换行T:GL_REPEAT

钳重复

换行S:GL_REPEAT /换行T:GL_CLAMP

重复夹

换行S:GL_REPEAT /换行T:GL_REPEAT

重复重复


谢谢。好答案。您是否知道GL_CLAMP_TO_EDGE和GL_CLAMP之间是否有任何区别,以及是否只是使纹理扩展以填充可用空间?
2013年

抱歉,我不清楚,我在这里说CLAMP的意思是GL_CLAMP_TO_EDGE,GL_CLAMP在现代OpenGL中已消失。我将编辑答案以强调这一点。
MickLH 2013年

至于“扩展”,如果只是意味着将纹理拉伸到其他范围,则应在网格参数化期间进行处理。(UV贴图,美工工作)。如果您真的必须进行实际操作,则必须编写自己的公式以在着色器中使用。(或者,如果您的应用程序已经严重过时,我猜是GL_TEXTURE矩阵:P)
MickLH 2013年

4

以下是2014年2月7日的glTexParameter上的OpenGL参考页面的摘录,其格式经过了一些简化,以便于阅读:

GL_TEXTURE_WRAP_S

将纹理坐标s的wrap参数设置为GL_CLAMP_TO_EDGE,GL_CLAMP_TO_BORDER,GL_MIRRORED_REPEAT,GL_REPEAT或GL_MIRROR_CLAMP_TO_EDGE。

  • GL_CLAMP_TO_EDGE导致s坐标被钳位到range 范围,其中N是在钳位方向上纹理的大小。

  • GL_CLAMP_TO_BORDER以类似于GL_CLAMP_TO_EDGE的方式评估s的坐标。
    但是,如果在GL_CLAMP_TO_EDGE模式下可能发生钳位,则将获取的texel数据替换为GL_TEXTURE_BORDER_COLOR指定的值。

  • GL_REPEAT导致s坐标的整数部分被忽略;
    GL仅使用小数部分,从而创建重复图案。

  • 如果s的整数部分为偶数,则GL_MIRRORED_REPEAT会将s坐标设置为纹理坐标的小数部分;否则,s坐标设置为纹理坐标的小数部分。如果s的整数部分为奇数,则将s纹理坐标设置为,其中代表s的小数部分。1分压裂

  • GL_MIRROR_CLAMP_TO_EDGE导致对于纹理的一个复制,像GL_MIRRORED_REPEAT一样重复s坐标,在该点上,像GL_CLAMP_TO_EDGE一样将坐标固定。

最初,GL_TEXTURE_WRAP_S设置为GL_REPEAT

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.