GL_R32I TexImage2D 没有正确上传

Posted

技术标签:

【中文标题】GL_R32I TexImage2D 没有正确上传【英文标题】:GL_R32I TexImage2D not uploading correctly 【发布时间】:2017-04-11 20:20:10 【问题描述】:

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

这里是相关的纹理创建和绑定代码:

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

【问题讨论】:

【参考方案1】:

您是否将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)

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

【讨论】:

啊!这是过滤模式。将其从“GL_LINEAR”设置为GL_NEAREST 有效。好像GL_INT 值不能被插值,有道理。

以上是关于GL_R32I TexImage2D 没有正确上传的主要内容,如果未能解决你的问题,请参考以下文章

获取使用 gl.texImage2D 绘制的纹理的“红色”像素值

android opengl位图图像未使用texImage2D渲染

将整数纹理附加到帧缓冲区

TypeError:无法在“WebGLRenderingContext”上执行“texImage2D”:重载解析失败

如何在 WebGL 的 texImage2D 中裁剪 HTMLVideoElement?

OpenGL 纹理格式 GL_R11F_G11F_B10F - 选择数据类型