GLSL 纹理不起作用

Posted

技术标签:

【中文标题】GLSL 纹理不起作用【英文标题】:GLSL Texture Won't Work 【发布时间】:2012-09-17 22:43:25 【问题描述】:

考虑以下几点:

virtual void Draw()

    _texture->Bind(0);

    _shader->Begin();
    _shader->SetUniform("WVPMatrix", _mvp);
    _shader->SetUniform("InColor", _color);
    _shader->SetUniformImm("InTexture", 0);
    _vbo.GetDeclaration().Activate();
    _vbo.Render(GL_QUADS, _ibo, 4);
    _shader->End();


void Texture2D::Bind(int index)

    if (index != -1)
    
        glActiveTexture(GL_TEXTURE0 + index);
    

    glBindTexture(GL_TEXTURE_2D, _textureID);

对 _shader->Begin()、_shader->SetUniform、_shader->SetUniformImm、_vbo.GetDeclaration().Activate 和 _vbo.Render 的调用就像我将片段着色器设置为渲染静态颜色(或甚至穿过制服的颜色)它渲染得很好。

现在我正在尝试渲染一个 texture2d(它加载得很好,我用立即模式进行了测试)并且我得到了一个黑屏,为什么?

顶点:

#version 330

layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 VertexTexCoord;

uniform mat4 WVPMatrix;

out vec2 TexCoord0;

void main()

    TexCoord0 = VertexTexCoord;

    gl_Position = WVPMatrix * vec4(VertexPosition, 1);

片段:

#version 330

in vec2 TexCoord0;

uniform sampler2D InTexture;
uniform vec4 InColor;

out vec4 OutFragColor;

void main()

    OutFragColor = texture(InTexture, TexCoord0) * InColor;

PS:InColor 是白色的,所以它不会与纹理颜色混淆,并且 TexCoord0 是有效的,因为我已经将 OutFragColor 上的 R 和 B 设置为 TexCoord0 的 S 和 T 来调试它的值。

【问题讨论】:

记得set minification filter 的纹理?您是否对着色器编译和链接进行错误检查? 天哪!我以更“漂亮”的方式重写了纹理加载,却忘了设置它们-_- 谢谢 小心,在你说它在即时模式下可以正常工作后,我几乎删除了我的评论>_>很高兴它有帮助。 【参考方案1】:

(贴出记账答案)

提问者忘记为他的纹理设置缩小过滤器,因此纹理不完整且不显示。

需要致电glTexParameteri(GL_TEXTURE_2D, GL_MIN_FILTER, GL_LINEAR);(或GL_NEAREST)

【讨论】:

不应该是GL_MIN_FILTERGL_TEXTURE_MIN_FILTER

以上是关于GLSL 纹理不起作用的主要内容,如果未能解决你的问题,请参考以下文章

GLSL 共享深度缓冲区似乎不起作用

OpenGL GLSL - 投影矩阵不起作用

绘制到纹理不起作用 LWJGL

纹理不起作用

科拉达。双面纹理不起作用

为啥我的 OpenGL 纹理不起作用?