Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenGL纹理不';不渲染_Python_Opengl_Texturing - Fatal编程技术网

Python OpenGL纹理不';不渲染

Python OpenGL纹理不';不渲染,python,opengl,texturing,Python,Opengl,Texturing,纹理根本不渲染,几何体都是黑色的 截图: 代码: 我还将链接到我试图渲染的纹理和transformations.py模块,但我的名声不允许添加两个以上的链接。谷歌搜索“modern opengl 02”将为您提供我从中获得的教程,而“transformations py”将为您提供后者 搜索“纹理素材开始”以查找纹理素材的设置位置 我试着戳了戳所有的部分(图像加载、纹理加载、纹理坐标数据、着色器),但我不知道有什么方法可以真正确定哪一个是错误的,就我所知,所有这些看起来都很好 更新:更新了代码,

纹理根本不渲染,几何体都是黑色的

截图:

代码:

我还将链接到我试图渲染的纹理和transformations.py模块,但我的名声不允许添加两个以上的链接。谷歌搜索“modern opengl 02”将为您提供我从中获得的教程,而“transformations py”将为您提供后者

搜索“纹理素材开始”以查找纹理素材的设置位置

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


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

我不是python高手,所以可能遗漏了一些东西

使所有碎片呈现黑色必须是以下事项之一:

  • 未加载纹理数据
  • 纹理未绑定到该着色器的采样器
  • 照明数学有问题吗
  • 制服未正确发送到着色器
  • 法线的属性不正确(就像它们都是0)
  • 因为你的着色器是一个直的
    finalColor=纹理(tex,fragTexCoord)
    在iOS中绑定纹理时,我必须执行以下操作:

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, texture);
        glUniform1i(glUniforms[U_textureSampler], 0);
    
    我假设你需要应用同样的步骤。也许
    texturebuffer.bind()
    会为您执行其中一个步骤。但在其他地方,您需要激活纹理采样器,绑定它,并设置制服

    未激活的纹理可能显示为黑色。未正确设置的制服可能会为该制服返回0

    在某些地方,您必须将着色器中的“uniform Sampler 2D tex”连接到渲染时绑定的纹理

    我还认为,调用你的纹理id
    tex
    (返回
    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