我不是 python 人,所以也许我错过了什么。
让所有片段呈现黑色必须是以下情况之一:
- 纹理数据未加载
- 纹理未绑定到该着色器的采样器
- 光照数学有问题
- 制服未正确发送到着色器
- Normal 的属性不好(比如全为 0)。
由于您的着色器是直接的finalColor = texture(tex, fragTexCoord);,因此排除了光照数学和制服。所以你的纹理采样器一定有问题。
在 iOS 中,当我绑定纹理时,我必须执行以下操作:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glUniforms[U_textureSampler], 0);
我假设您需要应用相同的步骤。也许texturebuffer.bind() 会为您完成这些步骤中的一个。但在其他地方,您需要激活纹理采样器、绑定它并设置制服。
未激活的纹理可能会显示为黑色。未正确设置的制服可能会为该制服返回 0。
您必须将着色器中的“uniform sampler2D tex”连接到渲染时绑定的纹理。
我还认为将纹理 ID 称为 tex(以 glGenTextures 返回的那个,然后还调用统一的 `tex')会令人困惑并且可能是错误的形式。这是两个不同的东西。一个是纹理id,另一个是uniform变量。
我要做的第一件事是将 id 的名称从 tex 更改为 texID 以使它们牢记在心。然后您可能会看到,在您的代码中,您没有获得 glsl 统一变量 tex 的统一位置 (glGetUniformLocation),顺便说一句,这必须在编译着色器之后 完成。也许python中有一些我没有看到的助手。
但是当您执行texture buffer.bind 时,将事物连接到统一变量“tex”的位置在哪里?
* 更新 1 *
关于如何获得该统一位置并使用它的建议。在编译着色器后执行此操作。它将统一的位置 ID 传递回您的应用:
u_tex = glGetUniformLocation(shader, "tex")
将纹理 id 变量更改为 texID,如下所示:
texID = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texID)
然后在你的显示循环中当你绑定纹理来使用它时:
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, texID)
glUniform1i(u_tex, 0)
我不得不承认我不知道texturebuffer.bind() 做了什么。所以可能在该行之前或之后尝试上面的 3 行。
* 更新 2 *
刚刚注意到您还缺少glEnable(GL_TEXTURE_2D),它应该与您的 glTexParameter 内容一起出现。将其添加到这些行之上。
* 更新 3 *
就像在着色器中进行测试一样,将 finalColor = texture(tex, fragTexCoord); 替换为 finalColor = vec4(1.0,0.0,0.0,1.0); 并查看框是否变为红色。因为现在我想起来我不知道finalColor 是什么。应该是gl_FragColor =。
* 更新 4 *
做上面的测试,确保你可以手动设置片段的颜色。我没有意识到您使用的是 OpenGL 3.0。我在想2.0。输出变量名称取决于您的 glsl 版本。您已将版本设置为 1.3。请参阅这篇文章并确保您也正确地做这部分:How does the fragment shader know what variable to use for the color of a pixel?