0

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

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

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

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

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

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

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

4

1 回答 1

1

我不是蟒蛇人,所以也许我错过了一些东西。

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

  1. 未加载纹理数据
  2. 纹理未绑定到该着色器的采样器
  3. 照明数学有问题
  4. 制服未正确发送到着色器
  5. 法线的不良属性(例如,如果它们全为 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 的名称从 更改为textexID以使它们在您的脑海中清晰可见。然后您可能会看到,您的代码中没有任何地方获得 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。请参阅这篇文章并确保您也正确执行了该部分:片段着色器如何知道将哪个变量用于像素的颜色?

于 2014-06-19T00:17:30.513 回答