c++ - GL_R32I TexImage2D 上传不正确

标签 c++ opengl opengl-3

我正在尝试创建一个色调映射片段着色器,以将值从 [0, someint] 映射到 RGB 值,但是当我尝试使用 GLint 时,渲染的纹理全为 0 .

下面是相关的纹理创建和绑定(bind)代码:

std::array<GLint , 25 > pixels;
int i=0;
float di = 255.0f / 25;
std::generate(pixels.begin(), pixels.end(), [&]{return di * i++;});

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, 5,5 ,0, 
GL_RED_INTEGER, GL_INT, pixels.data());

和片段着色器:

#version 330

in vec2 Texcoord;
out vec4 outColor;
uniform isampler2D tex;

void main()
{
    ivec4 val = texture(tex, Texcoord);
    float ret = 0;
    if(val.r == 0)
    {
        ret = 1;
    }
    outColor = vec4(ret,0,0, 1.0);
}

应用于 [0,1] 的基本 2 个三角形 UV 纹理 预期的结果是一个红色的角,其余的黑色,但整个正方形都是红色的,表示整个纹理为 0。

当我用 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 5, 5 ,0, GL_RED, GL_FLOAT, pixels.data());sampler2D,着色器的行为符合预期,但是我的值被限定为 [0,1]。枚举不匹配吗? glGetError 没有返回任何错误,但它可能以其他方式悄无声息地失败了?

我在 Ubuntu 上使用 GLFW 和 OpenGL 3.3,不确定该版本是否支持 GL_R32I

最佳答案

您是否将 GL_TEXTURE_MIN_FILTER 设置为 GL_*_MIPMAP_* 以外的任何内容?初始值为 GL_NEAREST_MIPMAP_LINEAR

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

否则纹理将无法工作,因为您只定义了一个 mipmap 级别。因此纹理不完整。

默认情况下,定义的最高 mipmap 级别是 1000。 您可以将它设置为 0,这将同样起作用。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0)

最大级别是从零开始的索引。

关于c++ - GL_R32I TexImage2D 上传不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43355491/

相关文章:

c++ - 为什么在成功将 bool 字符串值转换为 bool 值时,istringstream eof 标志没有变为真?

c++ - 如何在 Qt 的列表列表中推送值?

c++ - 其核心是如何实现 boost 元组(没有 boost header 中的所有额外细节)

java - LWJGL纹理显示时上下翻转

c++ - 如何根据 OpenGL 规范安全地确保(在任何平台上)正确实现 char* 类型?

c++ - GLSL 每个顶点固定大小的数组

c++ - Linux 多播后续套接字窃取数据

c++ - Anttweakbar glfw3 OpenGL 3.2 不绘图

c++ - 如何调试 OpenGL 程序?

c++ - 支持 OpenGL3 的 GUI-Toolkit