OpenGL纹理不会渲染

时间:2014-06-18 23:26:57

标签: python opengl texturing

纹理根本无法渲染,几何体全部为黑色。

屏幕截图:http://i.imgur.com/ypMdQY4.png

代码:http://pastebin.com/SvB8rxxt

我还会链接到我正在尝试渲染的纹理和transformations.py模块,但我没有声称可以放入两个以上的链接。谷歌搜索“现代opengl 02”将为您提供我从前获得的教程,“转换py”将为您提供后者。

搜索“TEXTURE STUFF START”以查找纹理内容的设置位置。

我试着戳了所有的部分(图像加载,纹理加载,纹理坐标数据,着色器)但我不知道一种方法来真正确定哪个是错误的,所有看起来都很好,据我所知

更新:更新了代码,修复了一些潜在问题,但仍然遇到了同样的问题。

1 个答案:

答案 0 :(得分:1)

我不是蟒蛇人,所以也许我错过了什么。

让所有渲染为黑色的片段必须是以下内容之一:

  1. 未加载纹理数据
  2. 纹理未绑定到该着色器的采样器
  3. 灯光数学有问题
  4. 制服未正确发送到着色器
  5. 法线的不良属性(如果它们都是0)。
  6. 因为你的着色器是一个直的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?