2017-04-11 67 views
0

我試圖創建一個色調映射片段着色器,將值從[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

回答

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) 

最大級別是從零開始的索引。

+0

啊!這是過濾模式。將其從'GL_LINEAR'設置爲'GL_NEAREST'即可。看起來像'GL_INT'值不能被內插,是有道理的。 –