让我们首先承认OpenGL被苹果弃用,最后支持的版本是4.1,这是一个遗憾,但嘿,我们必须以某种方式向前迈进,Vulkan是这样的:trollface:现在我们的系统已经没有这个问题了,让我们来看看我发现的这个奇怪的bug。让我澄清一下,我是在苹果Silicon M1上运行这个bug的,这是2020年底的MacBook Pro,运行macOS 11.6。让我们继续。
我一直在关注LearnOpenGL,我也发布了我的wipx 1 e1f1x来跟踪我的进度。一切都很好,直到我开始使用纹理。使用一个纹理很容易,所以我直接使用了多个纹理,这就是我遇到麻烦的时候。据我所知,工作流程或多或少
- 加载名为
textureData
的字节数组中的像素数据,以及额外信息 glGenTextures(1, &textureID)
glBindTexture(GL_TEXTURE_2D, textureID)
- 任意设置参数
glTexImage2D(GL_TEXTURE_2D, ... , textureData)
glGenerateMipmap(GL_TEXTURE_2D)
(尽管这可能是可选的)
这就是我在这里的工作
glUniform1i(glGetUniformLocation(ID, "textureSampler"), textureID)
- 冲洗并重复其他纹理
然后,在绘图循环中,我应该有以下内容:
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
。
不支持(记录一次):可能的问题:单元1 GLD_TEXTURE_INDEX_2D不可加载并绑定到采样器类型(浮点型)-使用零纹理,因为纹理不可加载
我已经追踪这个bug两天了,但网上并没有太多的信息。一些报告指出苹果的GLSL编译器可能有bug,还有一些报告指出需要绑定一个没有明显原因的额外纹理。这三条是我找到的最相关的信息:
- 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
然而,这些都没有给我带来多大的帮助。直到我不假思索地做了一件事。你们当中眼尖的人会注意到,我的git repo中的绘图代码略有不同。它在这里说,我实际上使用的是GL_TEXTURE1
和GL_TEXTURE2
。
我的理解是0
和1
是我激活和绑定的两个纹理单元,那么为什么使用纹理单元1
和2
会产生预期的结果呢?
我尝试在生成纹理之后和绑定之前添加对glActiveTexture(GL_TEXTURE0)
和1
的调用,但没有成功。我也尝试使用this person suggests这样的采样器数组,并使用一堆if
和整数索引,但当然我仍然得到错误的结果。
我花了几个小时尝试每一种可能的组合,唯一实用的“解决方案”是使用“+1”纹理单位,如GL_TEXTUREn
和n >= 1
。
问题:在第一段中表达了所有的警告,谁在这里做错了什么?是我这个菜鸟在现代硬件上学习几十年的老技术,还是它真的是苹果OpenGL或GLSL编译器实现中的一个bug,所以修复它的可能性为零,我应该继续我的“特殊硬件制造商”的拐杖?
2条答案
按热度按时间drkbr07n1#
您需要传递纹理槽索引,而不是将纹理句柄传递给
glUniform1i(glGetUniformLocation(ID, "textureSampler"), ...)
。例如,如果在绑定纹理之前执行了
glActiveTexture(GL_TEXTUREn)
,则传递n
。7tofc5zh2#
我知道这个问题已经在这个特定的情况下得到了解决,尽管我一直有相同的错误消息,即使在正确设置glsl均匀纹理绑定(“
unit 0 GLD_TEXTURE_INDEX_2D is unloadable and bound to sampler type (Float)
“)之后。我也在Mac M1上,使用OpenGL 2.1,我为纹理采样器设置了错误的参数(
GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR
,但没有绑定mipmap),设置一个“好”的参数解决了这个问题。其他开发人员出现相同错误消息的理由:还要检查纹理采样器参数是否正确。
干杯