[英]OpenGL texture doesn't render
纹理根本无法渲染,几何图形全为黑色。
截图: http : //i.imgur.com/ypMdQY4.png
代码: http : //pastebin.com/SvB8rxxt
我还将链接到我要渲染的纹理和Transformations.py模块,但是我没有声誉,不能放置两个以上的链接。 谷歌搜索“现代opengl 02”将为您提供从中获得前者的教程,而“ transformations py”将为您提供后者。
搜索“ TEXTURE STUFF START”以查找设置纹理的位置。
我尝试戳所有部分(图像加载,纹理加载,纹理坐标数据,着色器),但我不知道真正确定哪个缺陷的方法,就我所知,一切似乎都很好。
更新 :更新了代码,修复了一些潜在的问题,但仍然存在相同的问题。
我不是python专家,所以也许我缺少了一些东西。
将所有片段渲染为黑色必须是以下事情之一:
由于您的着色器是直接的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
以使它们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()
作用。 因此,请尝试在该行之前或之后的三行。
*更新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。 请参阅这篇文章,并确保您也正在正确地执行该部分: 片段着色器如何知道要用于像素颜色的变量?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.