GL_R32I TexImage2D无法正确上传

时间:2017-04-11 20:20:11

标签: c++ opengl opengl-3

我尝试创建色调图片段着色器,将值从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()); 映射到RGB值,但是当我尝试使用GLints时,渲染的纹理都是0。

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

#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]

适用于来自glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 5, 5 ,0, GL_RED, GL_FLOAT, pixels.data());的基本2个三角形UV纹理 预期结果将是一个红色角落,其余为黑色,但整个方块为红色,表示整个纹理为0。

当我尝试实验时 sampler2D[0,1],着色器的行为符合预期,但我的值被限制为glGetError。枚举是否不匹配? GL_R32I没有返回任何错误,但它可能会以其他方式无声地失败?

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

1 个答案:

答案 0 :(得分: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)

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