【问题标题】:How is GL_CLAMP in OpenGL different from GL_CLAMP_TO_EDGE?OpenGL 中的 GL_CLAMP 与 GL_CLAMP_TO_EDGE 有何不同?
【发布时间】:2019-06-30 07:22:05
【问题描述】:

根据您为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 Enterprise 版本中,我有以下内容。

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

它们被映射到不同的值,因此人们也会期望不同的行为。
我试图摆脱使用 GL_REPEAT 获得的伪像。请参阅下图中的绿色圆圈(图片来源 - freepik.com)。

GL_CLAMP 确实消除了伪影,但是我无法找到关于各种钳位模式有何不同的足够详细信息,以及何时更喜欢其中一种。

我正在我的 Windows 机器上编码,以后可能会将相同的应用程序移植到 GNU/Linux。

更新 1GL_CLAMP 消除了大多数伪像,但不是全部,最后我为我的所有纹理添加了一个 10 像素的透明边框。然而问题仍然存在。

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

【问题讨论】:

    标签: windows opengl textures rendering


    【解决方案1】:

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

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

    Spec 1.2 1998 添加CLAMP_TO_EDGE。它提供了您需要的线索:

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

    一种新的纹理钳制算法,CLAMP_TO_EDGE,钳制纹理 所有 mipmap 级别的坐标,使得纹理过滤器永远不会 对边框纹理进行采样。导出夹紧时返回的颜色 仅来自纹理图像边缘的纹素。


    CLAMP 选项在 2008 年规范 3.0 中已弃用,在 2009 年规范 3.2 核心中删除。如果(且仅当)您设置核心配置文件上下文。


    Microsoft doc 采用旧的CLAMP 的原因是,MS 提供了 OpenGL 1.1,而不需要检索指向 GL 命令的函数指针。更高的版本需要特殊的头文件(除了 gl.h)和其他特殊的东西。

    【讨论】:

    • 这很清楚。在 Windows 上编写 OGL 代码时应该参考哪些文档?我认为 MS 文档最贴切,但确实,Windows 本身并不支持更高版本的 OGL。我有一张 NVIDIA 卡,并且对我系统上更高版本的 OGL 的支持由 NVIDIA(以及用于板载显卡的英特尔)提供。最好参考 NVIDIA 文档(如果有的话)?
    • @SahilSingh 直接使用 OGL 时,官方文档是 Khronos Registry(我的答案中的链接)它的wiki site 也很好。对于间接使用(lwjgl、pyopengl 等),请使用这些 API 提供的文档。供应商/制造商(NVIDIA、AMD 等)也可能提供文档,但最好使用他们的网站作为示例、功能或技巧的来源。
    猜你喜欢
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多