GL_TEXTUREn+1 在 Apple Silicon M1 上激活和绑定而不是 GL_TEXTUREn(可能的错误)

GL_TEXTUREn+1 activated and bound instead of GL_TEXTUREn on Apple Silicon M1 (possible bug)

让我们首先承认 OpenGL 已被 Apple 弃用,最后支持的版本是 4.1,这很遗憾,但是嘿,我们必须以某种方式向前推进,而 Vulkan 就是这样:trollface: 现在已经结束了在我们的系统中,让我们来看看我发现的这个奇怪的错误。让我明确一点,我是 运行 在 Apple Silicon M1、2020 年末配备 macOS 11.6 的 MacBook Pro 上。让我们继续。

我一直在关注 LearnOpenGL and I have published my WiP right here 以跟踪我的进度。一切都很好,直到我得到纹理。使用一种纹理很容易,所以我直接使用了不止一种,这就是我遇到麻烦的时候。据我了解,工作流程或多或少

这就是我在 here 周围所做的,然后

然后,在绘图循环中,我应该有以下内容:

然后我准备我喜欢的片段着色器如下:

#version 410 core

out vec4 FragColor;
in vec2 TexCoord;

uniform sampler2D textureSampler;
uniform sampler2D otherTextureSampler;

void main() {
    if (TexCoord.x < 0.5) {
        FragColor = texture(textureSampler, TexCoord);
    } else {
        FragColor = texture(otherTextureSampler, TexCoord);
    }
}

我应该在屏幕上有一个四边形,其纹理由左半边的 textureSampler 和右半边的 otherTextureSampler 组成。相反,我的左半边有 otherTextureSampler,另一半是黑色,还有一条日志消息说

UNSUPPORTED (log once): POSSIBLE ISSUE: unit 1 GLD_TEXTURE_INDEX_2D is unloadable and bound to sampler type (Float) - using zero texture because texture unloadable

我已经追踪这个错误两天了,但 Internet 上的相关信息并不多。一些报告指出 Apple 的 GLSL 编译器中可能存在错误,另一些报告指出需要绑定额外的纹理,原因不明。这三个是我设法找到的最相关的信息:

然而,其中none对我帮助很大。直到我不假思索地做了一件事。眼尖的人会注意到我的 git 存储库中的绘图代码略有不同。它说 right here 我实际上正在使用 GL_TEXTURE1GL_TEXTURE2.

据我了解,01 是我激活和绑定的两个纹理单元,那么为什么要使用纹理单元 12产生预期的结果?

我试图在生成纹理之后和绑定它们之前立即添加对 glActiveTexture(GL_TEXTURE0)1 的调用,但成功率为零。我还尝试使用像 this person suggests 这样的采样器数组,并使用一堆 if 和整数索引,但当然我仍然得到错误的结果。

我花了几个小时尝试每一种可能的组合,唯一实用的“解决方案”是使用“+1”纹理单元,如 GL_TEXTUREnn >= 1

问题:在第一段中表达了所有警告,谁在这里做错了什么?是我这个试图在现代硬件上学习数十年历史的技术的菜鸟,还是它真的是 Apple 的 OpenGL 或 GLSL 编译器实现中的一个错误,所以修复它的可能性为零,我应该继续我的“特别”硬件制造商的“拐杖”?

无需将纹理句柄传递给 glUniform1i(glGetUniformLocation(ID, "textureSampler"), ...),您需要传递纹理插槽索引。

例如如果您在绑定纹理之前执行了 glActiveTexture(GL_TEXTUREn),请传递 n.