GL_R32I TexImage2D 上传不正确
GL_R32I TexImage2D not uploading correctly
我正在尝试创建一个色调贴图片段着色器,以将值从 [0, someint]
映射到 RGB 值,但是当我尝试使用 GLint 时,渲染的纹理全为 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
returns 没有错误,但它可能会以其他方式无声地失败?
我在 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)
最大级别是从零开始的索引。
我正在尝试创建一个色调贴图片段着色器,以将值从 [0, someint]
映射到 RGB 值,但是当我尝试使用 GLint 时,渲染的纹理全为 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
returns 没有错误,但它可能会以其他方式无声地失败?
我在 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)
最大级别是从零开始的索引。