Python OpenGL纹理不';不渲染
纹理根本不渲染,几何体都是黑色的 截图: 代码: 我还将链接到我试图渲染的纹理和transformations.py模块,但我的名声不允许添加两个以上的链接。谷歌搜索“modern opengl 02”将为您提供我从中获得的教程,而“transformations py”将为您提供后者 搜索“纹理素材开始”以查找纹理素材的设置位置 我试着戳了戳所有的部分(图像加载、纹理加载、纹理坐标数据、着色器),但我不知道有什么方法可以真正确定哪一个是错误的,就我所知,所有这些看起来都很好Python OpenGL纹理不';不渲染,python,opengl,texturing,Python,Opengl,Texturing,纹理根本不渲染,几何体都是黑色的 截图: 代码: 我还将链接到我试图渲染的纹理和transformations.py模块,但我的名声不允许添加两个以上的链接。谷歌搜索“modern opengl 02”将为您提供我从中获得的教程,而“transformations py”将为您提供后者 搜索“纹理素材开始”以查找纹理素材的设置位置 我试着戳了戳所有的部分(图像加载、纹理加载、纹理坐标数据、着色器),但我不知道有什么方法可以真正确定哪一个是错误的,就我所知,所有这些看起来都很好 更新:更新了代码,
更新:更新了代码,修复了一些潜在的问题,但仍然显示出相同的问题。我不是python高手,所以可能遗漏了一些东西 使所有碎片呈现黑色必须是以下事项之一:
finalColor=纹理(tex,fragTexCoord)这就排除了灯光和制服。所以你的纹理采样器一定出了问题
在iOS中绑定纹理时,我必须执行以下操作:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(glUniforms[U_textureSampler], 0);
我假设你需要应用同样的步骤。也许texturebuffer.bind()
会为您执行其中一个步骤。但在其他地方,您需要激活纹理采样器,绑定它,并设置制服
未激活的纹理可能显示为黑色。未正确设置的制服可能会为该制服返回0
在某些地方,您必须将着色器中的“uniform Sampler 2D tex”连接到渲染时绑定的纹理
我还认为,调用你的纹理idtex
(返回glGenTextures
的那一个,然后还调用统一的“tex”,这是两个不同的东西。一个是纹理id,另一个是统一变量
我要做的第一件事是将id的名称从tex
更改为texID
,让它们在您的脑海中清晰可见。然后您可能会发现,在您的代码中没有任何地方可以获得统一的位置(glGetUniformLocation)glsl统一变量tex
,顺便说一句,这必须在着色器编译之后完成。也许python中有一些助手我没有看到
但是,当您执行纹理缓冲区.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\u TEXTURE\u 2D)
,它应该与您的glTexParameter内容一起出现。请将它添加到这些行的上方
*更新3*
就像在着色器中的测试一样,用finalColor=vec4(1.0,0.0,0.0,1.0);
替换finalColor=tex(tex,fragTexCoord);
并查看框是否变红。因为现在我想起来了,我不知道finalColor
是什么。它应该是gl\u FragColor=
*更新4*
执行上述测试并确保您可以手动设置片段的颜色。我没有意识到您使用的是OpenGL 3.0。我考虑的是2.0。输出变量名称取决于您的glsl版本。您已将版本设置为1.3。请参阅本文并确保您也正确地设置了该部分:我认为您是对的,我没有进行设置统一正确。你能解释一下怎么做吗?glGetUniformLocation(shader,“tex”)
(这是glUniform1i
的第一个参数中的内容,对吧?)只返回0。我读取了更多信息,显然0是统一位置的有效值,但glUniform1i因“无效操作1282”而失败我想不出是什么。你要等到着色器编译好后才能执行glGetUniformLocation?我会将我的建议添加到答案中,以便对其进行格式化。是的,我将着色器作为参数传递给glGetUnformLocation
,所以我甚至不确定在创建它之前如何执行该操作。你的更新基本上是相同的我在你第一次回复后添加了我自己-不幸的是,glUniform1i
失败,出现了“无效操作”错误代码。谷歌搜索,这通常是使用纹理ID而不是统一位置的问题,但我使用的是统一位置(来自glGetUniformLocation(着色器,“tex”)
,无论如何,它们都具有相同的值0
。