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 以跟踪我的进度。一切都很好,直到我得到纹理。使用一种纹理很容易,所以我直接使用了不止一种,这就是我遇到麻烦的时候。据我了解,工作流程或多或少
- 在名为
textureData
的字节数组中加载像素数据,外加额外信息
glGenTextures(1, &textureID)
glBindTexture(GL_TEXTURE_2D, textureID)
- 随意设置参数
glTexImage2D(GL_TEXTURE_2D, ... , textureData)
glGenerateMipmap(GL_TEXTURE_2D)
(虽然这可能是可选的)
这就是我在 here 周围所做的,然后
glUniform1i(glGetUniformLocation(ID, "textureSampler"), textureID)
- 冲洗并重复 the other texture
然后,在绘图循环中,我应该有以下内容:
glUseProgram(shaderID)
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, textureID)
glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, otherTextureID)
然后我准备我喜欢的片段着色器如下:
#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 编译器中可能存在错误,另一些报告指出需要绑定额外的纹理,原因不明。这三个是我设法找到的最相关的信息:
- https://blog.dengine.net/2021/01/wonders-and-mysteries-of-the-m1/
- https://bugreports.qt.io/browse/QTBUG-89803
- https://bugreports.qt.io/browse/QTBUG-97981
然而,其中none对我帮助很大。直到我不假思索地做了一件事。眼尖的人会注意到我的 git 存储库中的绘图代码略有不同。它说 right here 我实际上正在使用 GL_TEXTURE1
和 GL_TEXTURE2
.
据我了解,0
和 1
是我激活和绑定的两个纹理单元,那么为什么要使用纹理单元 1
和 2
产生预期的结果?
我试图在生成纹理之后和绑定它们之前立即添加对 glActiveTexture(GL_TEXTURE0)
和 1
的调用,但成功率为零。我还尝试使用像 this person suggests 这样的采样器数组,并使用一堆 if
和整数索引,但当然我仍然得到错误的结果。
我花了几个小时尝试每一种可能的组合,唯一实用的“解决方案”是使用“+1”纹理单元,如 GL_TEXTUREn
和 n >= 1
。
问题:在第一段中表达了所有警告,谁在这里做错了什么?是我这个试图在现代硬件上学习数十年历史的技术的菜鸟,还是它真的是 Apple 的 OpenGL 或 GLSL 编译器实现中的一个错误,所以修复它的可能性为零,我应该继续我的“特别”硬件制造商的“拐杖”?
无需将纹理句柄传递给 glUniform1i(glGetUniformLocation(ID, "textureSampler"), ...)
,您需要传递纹理插槽索引。
例如如果您在绑定纹理之前执行了 glActiveTexture(GL_TEXTUREn)
,请传递 n
.
让我们首先承认 OpenGL 已被 Apple 弃用,最后支持的版本是 4.1,这很遗憾,但是嘿,我们必须以某种方式向前推进,而 Vulkan 就是这样:trollface: 现在已经结束了在我们的系统中,让我们来看看我发现的这个奇怪的错误。让我明确一点,我是 运行 在 Apple Silicon M1、2020 年末配备 macOS 11.6 的 MacBook Pro 上。让我们继续。
我一直在关注 LearnOpenGL and I have published my WiP right here 以跟踪我的进度。一切都很好,直到我得到纹理。使用一种纹理很容易,所以我直接使用了不止一种,这就是我遇到麻烦的时候。据我了解,工作流程或多或少
- 在名为
textureData
的字节数组中加载像素数据,外加额外信息 glGenTextures(1, &textureID)
glBindTexture(GL_TEXTURE_2D, textureID)
- 随意设置参数
glTexImage2D(GL_TEXTURE_2D, ... , textureData)
glGenerateMipmap(GL_TEXTURE_2D)
(虽然这可能是可选的)
这就是我在 here 周围所做的,然后
glUniform1i(glGetUniformLocation(ID, "textureSampler"), textureID)
- 冲洗并重复 the other texture
然后,在绘图循环中,我应该有以下内容:
glUseProgram(shaderID)
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, textureID)
glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, otherTextureID)
然后我准备我喜欢的片段着色器如下:
#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 编译器中可能存在错误,另一些报告指出需要绑定额外的纹理,原因不明。这三个是我设法找到的最相关的信息:
- https://blog.dengine.net/2021/01/wonders-and-mysteries-of-the-m1/
- https://bugreports.qt.io/browse/QTBUG-89803
- https://bugreports.qt.io/browse/QTBUG-97981
然而,其中none对我帮助很大。直到我不假思索地做了一件事。眼尖的人会注意到我的 git 存储库中的绘图代码略有不同。它说 right here 我实际上正在使用 GL_TEXTURE1
和 GL_TEXTURE2
.
据我了解,0
和 1
是我激活和绑定的两个纹理单元,那么为什么要使用纹理单元 1
和 2
产生预期的结果?
我试图在生成纹理之后和绑定它们之前立即添加对 glActiveTexture(GL_TEXTURE0)
和 1
的调用,但成功率为零。我还尝试使用像 this person suggests 这样的采样器数组,并使用一堆 if
和整数索引,但当然我仍然得到错误的结果。
我花了几个小时尝试每一种可能的组合,唯一实用的“解决方案”是使用“+1”纹理单元,如 GL_TEXTUREn
和 n >= 1
。
问题:在第一段中表达了所有警告,谁在这里做错了什么?是我这个试图在现代硬件上学习数十年历史的技术的菜鸟,还是它真的是 Apple 的 OpenGL 或 GLSL 编译器实现中的一个错误,所以修复它的可能性为零,我应该继续我的“特别”硬件制造商的“拐杖”?
无需将纹理句柄传递给 glUniform1i(glGetUniformLocation(ID, "textureSampler"), ...)
,您需要传递纹理插槽索引。
例如如果您在绑定纹理之前执行了 glActiveTexture(GL_TEXTUREn)
,请传递 n
.