我不是蟒蛇人,所以也许我错过了一些东西。
让所有片段呈现黑色必须是以下情况之一:
- 未加载纹理数据
- 纹理未绑定到该着色器的采样器
- 照明数学有问题
- 制服未正确发送到着色器
- 法线的不良属性(例如,如果它们全为 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,另一个是统一变量.
我要做的第一件事是将 id 的名称从 更改为tex
,texID
以使它们在您的脑海中清晰可见。然后您可能会看到,您的代码中没有任何地方获得 glsl 统一变量的统一位置 (glGetUniformLocation),顺便说一句tex
,这必须在编译着色器后完成。也许在我没有看到的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。请参阅这篇文章并确保您也正确执行了该部分:片段着色器如何知道将哪个变量用于像素的颜色?