【问题标题】:Can't spot the issue with my GLSL/OpenGL code无法发现我的 GLSL/OpenGL 代码的问题
【发布时间】:2015-02-17 08:28:12
【问题描述】:

我写了一个小程序来在一个简单的四边形中显示一个 32 位浮点纹理。显示四边形时,纹理颜色始终为黑色。我尝试了很多东西,但我无法让它发挥作用。我真的不知道它有什么问题。

创建OpenGL纹理的代码是这样的

glEnable(GL_TEXTURE_2D);
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, textureData);

使用调试器,这些调用中的任何一个都没有错误。我还检查了 textureData 指针,得到了预期的结果(在我的简化程序中,它只是一个渐变纹理)。

这是 GLSL 中的顶点着色器代码:

#version 400
in vec4 vertexPosition;
out vec2 uv;
void main() {
    gl_Position = vertexPosition;
    uv.x = (vertexPosition.x + 1.0) / 2;
    uv.y = (vertexPosition.y + 1.0) / 2;
}

这是一种简单的 UV 坐标生成,无需将它们作为顶点属性。对应的顶点缓冲对象真的很简单:

GLfloat vertices[4][4] = {
    { -1.0, 1.0, 0.0, 1.0 },
    { -1.0, -1.0, 0.0, 1.0 },
    { 1.0, 1.0, 0.0, 1.0 },
    { 1.0, -1.0, 0.0, 1.0 },
};

我已经测试了这个解决方案,它显示了我想要的覆盖整个窗口的四边形。在片段着色器中显示 UV 坐标再现了我期望得到的渐变。现在这里是片段着色器:

#version 400
uniform sampler2D myTex;
in vec2 uv;
out vec4 fragColor;

void main() {
   fragColor = texture(myTex, uv);
   // fragColor += vec4(uv.x, uv.y, 0, 1);
}

注释掉的行将 UV 坐标显示为颜色以用于调试目的。我在这里做错了什么?我只是不明白为什么纹理()调用返回 0 纹理看起来完全正确,并且 uv 坐标也是正确的。如果我做错了什么,我在这里链接完整的代码:gl-view.c

编辑:这就是我设置 myTex 采样器的方式:

glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
glUniform1i(glGetUniformLocation(shaderProgram, "myTex"), 0);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

编辑:清除顶点着色器代码。

【问题讨论】:

  • 你的顶点着色器 GLSL 代码中那个狂野的\ 是怎么回事?
  • @UniCell 如果它是该行的最后一个字符,那么它是有效的(就像在 C 中转义换行符)
  • @ratchetfreak 但看起来有点奇怪:D
  • 复制粘贴错误:原代码在C字符串中,换行符为'\n'-s。我只是忘了彻底清理。

标签: c opengl glsl texture-mapping


【解决方案1】:

我发现了问题:我没有在纹理上设置任何 MAG 或 MIN 过滤器。将 MIN 过滤器设置为 GL_NEAREST 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 2021-11-24
    • 2012-04-16
    • 2012-08-28
    • 2021-11-13
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多