2017-04-11 7 views
0

[0, someint]の値をRGB値にマッピングするためにtonemapフラグメントシェーダを作成しようとしていますが、GLintを使用しようとするとレンダリングされるテクスチャはすべて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()); 

とのフラグメントシェーダ:基本的な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,1] から期待される結果をテクスチャう1つの赤色のコーナーと残りの黒色ですが、正方形全体が赤色で、テクスチャ全体が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_FILTERGL_*_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); 

もしそうでなければ、単一のミップマップレベルしか定義されていないので、テクスチャは機能しません。したがって、テクスチャは不完全である。

デフォルトでは、最も高い定義済みのミップマップレベルは1000です。 0に設定すると、と同じようにの仕事になります。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0) 

最大レベルは0から始まるインデックスです。

+0

Ah!それはフィルタリングモードでした。 'GL_LINEAR'から 'GL_NEAREST'に設定しました。 'GL_INT'値のように補間することはできません。意味があります。 –

関連する問題