2015-10-21 39 views
0

我想用bindless紋理和多級採樣。但奇怪的事情發生。glGetTextureHandleARB隨後GL_TEXTURE_2D_MULTISAMPLE錯誤

我的質地應該是bindless:

glBindTexture(GL_TEXTURE_2D, texResolve); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); 

GLuint64 texResolveHandle = glGetTextureHandleARB(texResolve); 

GL_CHECK_ERROR("after glGetTextureHandleARB"); 
//glMakeTextureHandleResidentARB(texResolveHandle); 
//glMakeTextureHandleNonResidentARB(texResolveHandle); 

GL_CHECK_ERROR("after glMakeTextureHandleResidentARB"); 

//所有好爲止!

現在我創造學習我的多重採樣紋理,事情越來越奇怪:

glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texMSAA); 
GL_CHECK_ERROR("after glTexImage2DMultisample 1"); //still ok 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
GL_CHECK_ERROR("after glTexImage2DMultisample 2"); //ERROR 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
GL_CHECK_ERROR("after glTexImage2DMultisample 3"); //ERROR 

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, width, height, false); 
GL_CHECK_ERROR("after glTexImage2DMultisample texMSAA"); //Again OK ???? 

所以,我的問題:這是怎麼回事?

問候

+0

你不是在多重採樣紋理設置紋理參數,因爲你使用'GL_TEXTURE_2D'作爲第一個參數'glTexParameteri()'。話雖這麼說,設置在多樣本取樣器紋理參數將是一個錯誤,無論如何,它們不被支持。 –

+0

沒有什麼奇怪的努力線性濾波適用於多次採樣質地和得到一個錯誤。奇怪的是試圖過濾多重採樣的紋理。這些紋理的採樣方式與常規紋理不同,紋理過濾和包裝模式沒有意義。 –

+0

我明白了。說得通。但是,爲什麼只有當我創建紋理句柄時纔會失敗? – user3497417

回答

0

既然你綁定的紋理GL_TEXTURE_2D_MULTISAMPLE結合點,你也有在glTexParameteri調用使用的綁定點。

glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, GL_REPEAT); 
GL_CHECK_ERROR("after glTexImage2DMultisample 2"); 

glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
GL_CHECK_ERROR("after glTexImage2DMultisample 3"); 

注意,在OpenGL的結合點是「按類型」,所以一個可以結合,例如,GL_TEXTURE_2D,並在同一時間GL_TEXTURE_3D到相同的活性紋理單元。

+1

所有這些調用將導致錯誤。從4.5規範:「是如果有效目標要麼TEXTURE_2D_MULTISAMPLE或TEXTURE_2D_MULTISAMPLE_ARRAY,並且PNAME是從表23.18任何採樣狀態生成一個INVALID_ENUM錯誤」。 –