正确创建多重采样纹理

ima*_*ett 4 opengl textures

对于标准 OpenGL 纹理,过滤状态是纹理的一部分,必须在创建纹理时定义。这导致代码如下:

glGenTextures(1,&_texture_id);
glBindTexture(GL_TEXTURE_2D,_texture_id);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(...);
Run Code Online (Sandbox Code Playgroud)

这非常有效。我正在尝试制作多重采样纹理(用于 FBO)。代码非常相似:

glGenTextures(1,&_texture_id);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,_texture_id);
glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2DMultisample(...);
Run Code Online (Sandbox Code Playgroud)

我正在使用调试上下文,并且使用此代码,第一次glTexParameterf(...)调用会导致:

生成 GL_INVALID_ENUM 错误。多重采样纹理目标不支持采样器状态

我不知道这是什么意思。请注意,多重采样纹理仅支持最近过滤。我正在指定这一点。我注意到,对于某些调用(特别是glTexParameterf(...)),GL_TEXTURE_2D_MULTISAMPLE不是文档中列出的输入(如果它们实际上无效,而不仅仅是忘记,这确实可以解释无效的枚举错误)。但是,如果不被接受,那么我应该如何设置最近的过滤?

Guy*_*yRT 7

您不需要设置最近的过滤,因为多重采样纹理根本不会被过滤。该规范(第 8.10 节)确实将GL_TEXTURE_2D_MULTISAMPLE其列为有效目标glTexParameteri(您应该使用它而不是glTexParameterf整数参数),但列出了可能的错误:

如果目标是 TEXTURE_2D_MULTISAMPLE 或 TEXTURE_2D_MULTISAMPLE_ARRAY,并且 pname 是表 23.18 中的任何采样器状态,则会生成 INVALID_ENUM 错误。