OpenGL中的GL_CLAMP与GL_CLAMP_TO_EDGE有何不同?

时间:2019-06-30 07:22:05

标签: windows opengl textures rendering

根据您引用glTexParameteri()的文档,对纹理的夹持有两种不同的解释。
Microsoft's documentation中,您将找到 GL_CLAMP ,而在Khronos's documentation中,您将找到 GL_CLAMP_TO_EDGE

我认为它们在功能上是同义词,但事实并非如此。
在我的Ubuntu 18.04.2上,我有以下内容。

/usr/include/GL/gl.h
#define GL_CLAMP_TO_EDGE                        0x812F
#define GL_CLAMP                                0x2900
#define GL_CLAMP_TO_BORDER                      0x812D

在Windows 10 16299企业版中,我具有以下条件。

C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um\gl\GL.h
#define GL_CLAMP                          0x2900

它们被映射为不同的值,因此人们也会期望不同的行为。
我正在尝试摆脱使用GL_REPEAT所获得的工件。请参见下图的绿色圆圈(图像来源-freepik.com)。

Womain's face - freepik

GL_CLAMP确实消除了工件,但是我无法找到有关各种夹紧模式如何不同以及何时会比另一种更喜欢的夹紧模式的足够细节。

我正在Windows计算机上进行编码,以后可能会将同一应用程序移植到GNU / Linux。

更新1 GL_CLAMP使我摆脱了大部分(但不是全部)伪像,最后,我为所有纹理添加了10px透明边框。但是问题仍然存在。

更新2 :问题不在于GL_CLAMP在实现之间有何不同,但 GL_CLAMP与GL_CLAMP_TO_EDGE有何不同? >

1 个答案:

答案 0 :(得分:1)

如果您深入研究Khronos Registry不同的GL规范,则会发现一些解释。

在最初的规范(1.0 1994)中,REPEATTEXTURE_WRAP_xCLAMP_TO_EDGE参数的唯一选项。

规范1.2 1998添加了CLAMP。它提供了您需要的线索:

  

GL通常会进行钳制,以使纹理坐标严格限制在[0; 1]范围内。当使用此算法钳制纹理坐标时,纹理采样滤镜跨过纹理图像的边缘,从纹理图像内部获取一半的采样值,从纹理边界获取另一半的采样值。有时需要在不使用边框且不使用恒定边框颜色的情况下夹紧纹理。

     

新的纹理钳制算法CLAMP_TO_EDGE钳制纹理   在所有mipmap级别进行协调,以使纹理过滤器永远不会   采样边框纹理。派生夹紧时返回的颜色   仅来自纹理图像边缘的纹理像素。


CLAMP选项已在规范3.0 2008中弃用,并在规范3.2 Core 2009中已已删除。只要(且仅)当您不要时,您仍然可以使用它设置 Core Profile 上下文。


Microsoft文档采用旧版{{1}}的原因是MS提供了OpenGL 1.1,而无需检索GL命令的功能指针。更高版本需要特殊的标头(gl.h除外)和其他特殊的东西。