【问题标题】:OpenGL texture doesn't renderOpenGL纹理不渲染
【发布时间】:2014-08-09 09:34:44
【问题描述】:

纹理根本不渲染,几何体全黑。

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

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

我还会链接到我正在尝试渲染的纹理和 transformations.py 模块,但我没有被允许放置两个以上链接的声誉。谷歌搜索“modern opengl 02”将为您提供我从中获得前者的教程,而“transformations py”将为您提供后者。

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

我尝试检查所有部分(图像加载、纹理加载、纹理坐标数据、着色器),但我不知道有什么方法可以真正确定哪个有问题,据我所知,一切似乎都很好.

更新:更新的代码修复了一些潜在问题,但仍然出现相同的问题。

【问题讨论】:

    标签: python opengl texturing


    【解决方案1】:

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

    让所有片段呈现黑色必须是以下情况之一:

    1. 纹理数据未加载
    2. 纹理未绑定到该着色器的采样器
    3. 光照数学有问题
    4. 制服未正确发送到着色器
    5. 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?

    【讨论】:

    • 我认为你是对的,我没有正确设置制服。你能解释一下怎么做吗? glGetUniformLocation(shader, "tex")(这是 glUniform1i 的第一个参数中的内容,对吗?)只返回 0。
    • 我阅读了更多内容,显然 0 是统一位置的有效值,但 glUniform1i 失败并出现“无效操作 1282”,我无法弄清楚。
    • 您在等到编译着色器之后才执行 glGetUniformLocation 对吗?我会将我的建议添加到答案中,以便对其进行格式化。
    • 是的,我将着色器作为参数传递给glGetUnformLocation,所以我什至不确定在创建它之前我该怎么做。
    • 您的更新与我在您第一次回复后添加的内容基本相同 - 不幸的是,glUniform1i 失败并显示“无效操作”错误代码。谷歌搜索,这通常是使用纹理 ID 而不是统一位置的问题,但我 am 使用统一位置(来自glGetUniformLocation(shader, "tex"),无论如何,它们都具有相同的 @ 值987654346@.
    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多