2012-04-07 9 views
5

GeForce 330m上で動作するジオメトリシェーダから整数テクスチャをサンプリングしようとしています。テクスチャにロードする以外の値を返すようです。私は、テクスチャを作成し、ロードする(基本的に)は、このコードを使用する:OpenGLジオメトリシェーダの整数テクスチャフェッチが失敗する

glGenTextures(1, &textureId); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_INT, <some 0-initialized large enough buffer>); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
    int data[] = { 3, 0, 36, 400 }; 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 3, 1, 1, GL_RGBA, GL_INT, data); 
glBindTexture(GL_TEXTURE_2D, 0); 

アイデアは具体的には一つの画素が、私はその後、私のジオメトリシェーダでこれを使用して400のW値を有するように設定されていることである。

#version 330 
#extension GL_EXT_gpu_shader4 : require 
uniform isampler2D models; 

void main() 
{ 
    ivec4 modelstats4 = texelFetch2D(models, ivec2(0, 3), 0); 
// ivec4 modelstats4 = ivec4(3, 0, 36, 400); 
    if (modelstats4.w > height) { 
     // emit something 
    } 
} 

等しくなければならないコメントアウトされた固定値を使用すると、何かが放出されます(IE、1点)。実際のテクセルフェッチを使用すると、何も返されません。私が知っていることを知っているすべての値が影響を与えることができるようになりました。これはなぜ機能しないのですか?これは完全なコードではありませんが、これは適切なデータを持つ関連OpenGL呼び出しです。

+0

質問に回答するか、削除してください。それは未回答の質問リストに置かれているだけなので: – kravemir

+0

ありがとうMiro、それを知らなかった。 – dascandy

答えて

4

glGetErrorsのリバーサルスプリンクルで解決策を見つけました。このコード例では、すべてのglTexImageにエラーがありました。明らかに整数テクスチャの場合、GL_RGBAではなくGL_RGBA_INTEGERを使用してください。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data); 

これで機能します。テクスチャフェッチもOKです。

関連する問題