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

使用着色器渲染时,OpenGL纹理为全黑色

严玉泽
2023-03-14

我有一个非常简单的OpenGL应用程序,只渲染一个带纹理的四边形。这是我的代码,效果很好(带纹理的四边形看起来很好):

// Bind the test texture
glBindTexture(GL_TEXTURE_2D, mTestTexture);


// Draw the quad
glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f);
glVertex3f(x, y + (float)height, 0.0f);

glTexCoord2f(1.0f, 0.0f);
glVertex3f(x + (float)width, y + (float)height, 0.0f);

glTexCoord2f(1.0f, 1.0f);
glVertex3f(x + (float)width, y, 0.0f);

glTexCoord2f(0.0f, 1.0f);
glVertex3f(x, y, 0.0f);

glEnd();

然后我想介绍一个简单的着色器。所以我稍微修改了我的代码:

// Use shader and point it to the right texture
auto texLocation = glGetUniformLocation(mProgram, "tex");
glUseProgram(mProgram);
glUniform1i(texLocation, mTestTexture);

// Draw the quad
// Same drawing code as before...

顶点着色器:

void main(void)
{
 gl_Position     = ftransform();
 gl_TexCoord[0]  = gl_MultiTexCoord0;
}

片段着色器:

uniform sampler2D tex;

void main()
{
    vec4 color = texture2D(tex, gl_TexCoord[0].st);
    gl_FragColor = color;
}

现在我得到的只是一个黑色的四边形:-(

我已经尝试并测试了很多东西:

  • 着色器编译良好(无错误)

有人知道为什么我在使用着色器时看不到我的纹理吗?

共有1个答案

燕翔飞
2023-03-14
glUniform1i(texLocation, mTestTexture);
                         ^^^^^^^^^^^^ texture object

纹理单元索引绑定到采样器,而不是纹理对象。

改为使用纹理单位零:

glUniform1i(texLocation, 0);
 类似资料:
  • 我想在FBO中加载两个纹理,其中一个纹理包含HDR图像,我的第一个目标是将图像从第一个纹理“复制”到第二个纹理(该纹理为空),并称为“下采样纹理”。 所以我创建FBO,加载我想用颜色_附件_0书写的纹理,并绑定它;然后初始化我的着色器程序并渲染一个四边形,其中包含我要在GL\u texture\u 0中读取的纹理。 然后我解开FBO并绑定“DownSamplingTex”,然后画一个四元组。 我不

  • 在一个教程之后,我将尝试使用FreeType在OpenGL中渲染文本。因此,灰度8位图像用作每个字符的纹理,使图像的每个字节对应于纹理的红色分量。 为了以其他颜色呈现文本,建议您使用着色器。但是,当使用提供的着色器时,我看到的不是彩色字母,而是彩色框,好像根本没有纹理。 以下是没有着色器时的效果: 这是它在着色器中的外观: (盒子的位置也会发生变化) 以下是顶点着色器代码: 这是片段着色器代码:

  • 这是代码中唯一可能有错误的部分: 你能在这段代码中看到什么错误吗?启用glEnable(GL_TEXTURE_2D)并没有什么不同。纹理坐标是正确的,片段和顶点着色器肯定是正确的。 解决了这不是问题,我仍在使用glGenerateMipmap(…)在glTexImage2D(…)之前。真正的问题是,当我的图像是GL_RGB格式时,我通过了格式GL_RGBA。另外我的t-

  • 我正在渲染很多轴对齐的3D立方体。每个立方体的中心位置和/或颜色可能不同于其他立方体。这就是我现在渲染它的方式 My DrawCube()使用和存储在VBO中的顶点数据,简单地渲染立方体每一侧对应的6个四边形。glVertexPointer和glColorPointer用于设置属性元素。 这是可行的,但是我想通过使用可能是glDrawElementsInst的()来使用即时渲染。但是由于项目的一些

  • 我是OpenGL的新手,在整理如何将纹理和着色器绑定到VBOs时遇到了困难。 我正在使用Cinder的纹理和着色器类。以下是我绘制方法的一部分: 在上面的代码中,如果我注释掉对mShader的调用。bind(),我的球体VBO将显示纹理(myImage)。我的着色器适用于普通(无纹理)形状,但当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理显示。 这是我使用的着色器的问题,还是我不理

  • 纹理根本不渲染,几何体都是黑色的。 截图:http://i.imgur.com/ypMdQY4.png 代码:http://pastebin.com/SvB8rxxt 我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。 搜索“纹理材料开始”以查找纹理材料的设置位