纹理根本无法渲染,几何体全部为黑色。
屏幕截图:http://i.imgur.com/ypMdQY4.png
代码:http://pastebin.com/SvB8rxxt
我还会链接到我正在尝试渲染的纹理和transformations.py模块,但我没有声称可以放入两个以上的链接。谷歌搜索“现代opengl 02”将为您提供我从前获得的教程,“转换py”将为您提供后者。
搜索“TEXTURE STUFF START”以查找纹理内容的设置位置。
我试着戳了所有的部分(图像加载,纹理加载,纹理坐标数据,着色器)但我不知道一种方法来真正确定哪个是错误的,所有看起来都很好,据我所知
更新:更新了代码,修复了一些潜在问题,但仍然遇到了同样的问题。
答案 0 :(得分:1)
我不是蟒蛇人,所以也许我错过了什么。
让所有渲染为黑色的片段必须是以下内容之一:
因为你的着色器是一个直的finalColor = texture(tex, fragTexCoord);
,它排除了灯光数学和制服。所以纹理采样器出了问题。
在iOS中绑定纹理时,我必须执行以下操作:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glUniforms[U_textureSampler], 0);
我认为你需要应用相同的步骤。也许texturebuffer.bind()
会为您完成其中一个步骤。但在某处你需要激活纹理采样器,绑定它,并设置制服。
未激活的纹理可能显示为黑色。未正确设置的制服可能会为该制服返回0。
在某些地方你必须将着色器中的`uniform sampler2D tex'连接到渲染时绑定的纹理。
我也认为调用你的纹理标识tex
(使用glGenTextures
返回的那个,然后也调用统一的`tex')会让人感到困惑和形式不好。这是两个不同的东西一个是纹理id,另一个是统一变量。
我要做的第一件事就是将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?