2012-04-07 136 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,一點)。如果我使用實際的texel獲取,它不會返回任何內容。我所知道的所有可以產生影響的值現在都是硬編碼的,所以我不知道爲什麼這種方法無效。這不是完整的代碼(OO設置,需要仔細查看),但這些是與相關數據相關的OpenGL調用。

+0

你應該回答你的問題或刪除它。因爲它只保留在未回答的問題列表:) – kravemir 2012-05-19 18:02:45

+0

感謝米羅,不知道。 – dascandy 2012-06-09 10:49:02

回答

4

通過自由噴灑glGetErrors找到解決方案。該代碼示例中的每個glTexImage都存在該錯誤 - 顯然,對於整數紋理,您不能使用GL_RGBA,而應該使用GL_RGBA_INTEGER。

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

現在可以工作。紋理提取也可以。