当前位置: 首页 > 知识库问答 >
问题:

OpenGL纹理不渲染

陈兴朝
2023-03-14

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

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

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

我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。

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

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

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

共有1个答案

谢墨竹
2023-03-14

我不是巨蟒,所以我可能错过了什么。

让所有碎片呈现黑色必须是其中之一:

  1. 纹理数据未加载
  2. 纹理未绑定到该着色器的采样器
  3. 照明数学有问题
  4. 制服没有正确发送到着色器
  5. 法线的属性不好(比如它们都是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”连接到渲染时绑定的纹理。

我还认为,调用你的纹理idtex(返回glGenTextures的那一个,然后还调用统一的“tex”,这是两个不同的东西。一个是纹理id,另一个是统一变量。

我要做的第一件事是将id的名称从tex更改为texID以使它们在您的脑海中保持清晰。然后您可能会看到,在您的代码中没有任何位置可以获得glsl统一变量tex的统一位置(glGetUniformloc),顺便说一句,这必须在着色器编译后完成。也许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()。所以你可以在这条线之前或之后尝试上面的三条线。

*更新2*

刚刚注意到您还缺少了glEnable(GL_TEXTURE_2D),它应该与您的glTexParameter内容一起出现。将其添加到这些行之上。

*更新3*

就像在着色器中进行测试一样,替换finalColor=纹理(tex,fragTexCoord) 带有finalColor=vec4(1.0,0.0,0.0,1.0) 并查看框是否变为红色。因为现在我想起来了,我不知道什么是finalColor。它应该是gl\u FragColor=

*更新4*

进行上述测试,确保可以手动设置片段的颜色。我不知道你在OpenGL 3.0中。我在想2.0。输出变量名取决于您的glsl版本。您已将版本设置为1.3。请看这篇文章,并确保你也正确地完成了这一部分:片段着色器如何知道像素颜色的变量?

 类似资料:
  • 我正在尝试使用OpenGL GLSL着色器渲染到纹理。首先,我尝试用白色填充30x30纹理的每个像素。我将顶点着色器索引从0传递到899,表示纹理的每个像素。对吗?顶点着色器: 片段着色器:

  • 使用LWJGL的OpenGL版本1.1和2D纹理,我发现自己卡住了... 出于某种原因,LWJGL引擎不会在2D图层上渲染加载的纹理...相反,我得到了一个白色正方形... 我假设我很有可能在代码的某个地方遗漏了什么..以下是与此类事件相关的全部代码.. 加载OpenGL环境: 进入2D绘图模式(用于绘制纯色正方形的功能-通过glcolor函数进行测试,然后通过glvertex调用尺寸): 加载映

  • 所以我有一个非常简单的glsl着色器,可以用纹理和平行光渲染对象。 现在我有一个非常艰难的时间试图得到的纹理显示,其他一切工作,除此之外。 当我禁用着色器(glUseProgram(0))时,纹理以黑色和白色渲染,但当我启用它时,整个网格是单一颜色,没有纹理,当我尝试不同的纹理时,它会改变颜色。 这就是我加载纹理的方式 这就是我如何绑定我的纹理 这是我的顶点着色器 这是我的碎片着色器 最后但并非最

  • 我做了一个在上面渲染天空盒和粒子的应用程序。我想添加一些效果,我需要使用帧缓冲区来渲染天空盒、粒子颜色、深度和位置以分离纹理。然后我想使用简单的着色器来使用这些纹理中的值并以适当的方式混合它们。我为纹理、帧缓冲区和屏幕四边形(渲染简单的矩形)编写了辅助类,但不幸的是——当我尝试使用它时没有任何渲染。 当绑定帧缓冲区被注释掉时,我的场景如下所示: 修改着色器表明深度和位置值计算正确。因此问题在于纹理

  • 我试图用opengl在Qt中显示纹理,但当我运行时它就是不显示纹理。 我做了一些研究,发现我需要将纹理的高度和宽度设为2的幂。我的纹理现在是(1024x1024)。 我还添加了很多glTexParameterf,可以解决我的问题,但仍然没有运气。 EDIT1:是不是我的质地太大了? EDIT2:glBindTexture(GL_TEXTURE_2D,m_textureID);放置在glBindTe

  • 我正在对对象进行两次模糊处理。为了确保在中,整个场景都被我试图模糊的图像所覆盖。这是过程。 > < li >我设置了一个< code>FBO,其中包含我需要模糊的图像尺寸。 < li> 我正在使用以下函数设置< code >正交投影(称为< code >设置正交(FBO尺寸)): glViewport(0,0,w,h)glMatrixMode(GL _ PROJECTION)glload iden