我尝试创建色调图片段着色器,将值从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}}?
答案 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)
最高级别是从零开始的索引。