使用OpenGL核心功能和扩展



我想在我的程序中使用DXT压缩纹理,所以我正在加载这样的核心函数指针:

/* GL 1.3 core */
PFNGLCOMPRESSEDTEXIMAGE2DPROC       glCompressedTexImage2D      = NULL;
/* ... */
/* check GL version using glGetString(GL_VERSION) */
/* ... */
glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)wglGetProcAddress(
                "glCompressedTexImage2D");
if (!glCompressedTexImage2D)
return 0;
/* check if GL_EXT_texture_compression_s3tc is available */

然后,我使用这样的函数:

glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, width,
                    height, 0, size, ptr);

它工作得很好,但我怀疑这一点的原因是,有人告诉我,我不能将OpenGL核心功能与以下扩展功能混合使用:

glGenBuffersARB(1, &id);
glBindBuffer(GL_ARRAY_BUFFER, id);

或者,通过一些扩展添加令牌的核心功能,如

glActiveTexture(GL_TEXTURE0_ARB);

但我使用的是glCompressedTexImage2D(核心函数)和GL_COMPRESSED_RGB_S3TC_DXT1_EXT(GL_EXT_texture_compression_S3TC添加的令牌)。

那么,可以将未添加到核心的扩展(如GL_EXT_texture_compression_s3tc或WGL_EXT_swap_control等扩展)函数/令牌与核心函数一起使用吗?

一般来说,最好不要将核心定义和扩展定义混合用于相同的功能。通常情况下,扩展被提升为核心功能,具有相同的定义,这不是问题。但在某些情况下,核心功能与扩展中定义的相同功能的早期版本并不完全相同。

一个常见的例子是FBO(帧缓冲区对象)。在OpenGL 3.0中引入FBO作为核心功能之前,有许多与FBO功能相关的不同扩展,其中一些扩展与最终作为核心功能的扩展并不完全相同。因此,混合旧的扩展和FBO的核心定义将是一个坏主意。

然而,在这种特殊情况下,它是完全好的。预计许多/大多数压缩纹理格式都是扩展。其中许多是特定于供应商的,并且涉及专利,因此它们很可能永远不会成为核心功能。该规范适用于此。glCompressedTexImage2D()的一些规格报价清楚地表明了这一点:

internalformat必须是支持的特定压缩内部格式。

对于所有其他压缩内部格式,压缩图像将根据内部格式标记的具体定义进行解码。

特定压缩内部格式可能会对压缩图像指定调用或参数的使用施加特定格式的限制。

EXT_texture_compression_3tc的扩展定义也证实了COMPRESSED_RGB_S3TC_DXT1_EXT可以用作glCompressedTExImage2D():的自变量

This extension introduces new tokens:
    COMPRESSED_RGB_S3TC_DXT1_EXT                   0x83F0
    COMPRESSED_RGBA_S3TC_DXT1_EXT                  0x83F1
    COMPRESSED_RGBA_S3TC_DXT3_EXT                  0x83F2
    COMPRESSED_RGBA_S3TC_DXT5_EXT                  0x83F3
In OpenGL 1.2.1 these tokens are accepted by the <internalformat> parameter
of TexImage2D, CopyTexImage2D, and CompressedTexImage2D and the <format>
parameter of CompressedTexSubImage2D.

支持的压缩纹理格式的列表也可以在不查询扩展的情况下获得。您可以使用glGetIntegerv()来枚举它们:

GLint numFormats = 0;
glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats);
GLint* formats = new GLint[numFormats];
glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, formats);

这将直接为您提供glCompressedTexImage2D()所接受的格式列表。

在核心中使用扩展是完全可能的。岩心剖面只是意味着,过去的某些碎片已经被去除,好吧,岩心。但是,OpenGL上下文报告的glGetStringi报告的扩展字符串中可用的所有内容都可以在该上下文中合法使用。任何不"核心兼容"的扩展都不会出现在纯核心上下文中。

此外,纹理压缩是核心轮廓中备受关注的扩展之一。看见https://www.opengl.org/wiki/OpenGL_Extension#Targeting_OpenGL_3.3

最新更新