我試圖創建一個色調映射片段着色器,將值從[0, someint]
映射到RGB值,但是當我嘗試使用GLints時,渲染的紋理全部爲0。GL_R32I TexImage2D無法正確上傳
下面是相關的紋理創建和綁定代碼:
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());
和碎片着色器:這是適用於從[0,1]
預期的結果將紋理一個基本的2個三角形UV
#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.
當我嘗試 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_LINEAR'設置爲'GL_NEAREST'即可。看起來像'GL_INT'值不能被內插,是有道理的。 –