OpenGL生成的纹理总是黑色的?

Posted

技术标签:

【中文标题】OpenGL生成的纹理总是黑色的?【英文标题】:OpenGL generated texture always black? 【发布时间】:2013-09-29 12:48:19 【问题描述】:

我正在生成纹理:

glGenTextures(1, &texA);
glBindTexture(GL_TEXTURE_2D, texA);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
GLubyte* data = (GLubyte *) malloc(32*32*4*sizeof(GLubyte));
    for (int i = 0; i < 32 * 32 * 4; i+=4)   
      data[i] = data[i+1] = data[i+2] = 123;
      data[i+3] = 255;
    
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA,GL_UNSIGNED_BYTE, data);

现在我想将它传递给我的着色器:

glBindTexture(GL_TEXTURE_2D,texA);
glUniform1i(inputTextureLocation, 0);

但是当我尝试在片段着色器中使用它时,我只能得到黑色:

out vec4 color
uniform sampler2D inputTex;
void main() 
    color = vec4(texture2D(inputTex, vec2(1,1)).xyz, 1);

感谢您的帮助。

【问题讨论】:

是 inputTextureLocation != -1 吗?纹理实际上是否绑定到纹理图像单元 0?是否有绑定到纹理图像单元 0 的采样器? 纹理位置不是-1,添加 glActiveTexture(GL_TEXTURE0) 不会改变任何事情,我不知道那个采样器,如何检查它是否设置? 【参考方案1】:

您总是从同一个位置进行采样 - 在这种情况下为 (1,1)。如果您希望每个片段的颜色发生变化,texture2D 的第二个参数需要按片段更改。通常,您会执行以下操作:

texture2D (inputTex, gl_TexCoord[0].xy);

或类似的。 (当然,这意味着您还需要在几何体上设置纹理坐标。如果不这样做,所有顶点都可能以相同的纹理坐标结束。)

【讨论】:

是的,我知道,但我已将纹理的每个像素设置为相同的颜色,所以这并不重要。它仍然不会显示我设置的颜色。 我已经找到了解决方案。一如既往,无知和愚蠢是罪魁祸首……我在代码的其他地方借助纹理渲染文本……

以上是关于OpenGL生成的纹理总是黑色的?的主要内容,如果未能解决你的问题,请参考以下文章

Qt OpenGL纹理是黑色的

opengl - 黑色纹理,如何在缓冲区上使用 glm::vec*?

如果当前处于活动状态,则 OpenGL 纹理不会渲染

OpenGL 纹理在 3.3 中都是黑色的 - 但在 3.1 中有效

OpenGL 3.30 / GLSL 3.30 - MRT 输出黑色纹理

现代OpenGL 3.3核心黑色纹理