2014-09-03 79 views
0

我正在開發Android上的OpenGL ES 3.0應用程序,主要是在Java中,我需要使用浮點渲染紋理。如何在Android上使用OpenGL ES擴展

GLES30.glGetString(GLES30.GL_EXTENSIONS) 

返回包含GL_EXT_color_buffer_half_float一個字符串,GL_EXT_color_buffer_float等等=>我的設備支持浮點紋理,很明顯。

但是,我現在有點迷路瞭如何使用這些擴展。當我使用GL_RGBA代替GL_RGBA16F 調用

GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, null); 

導致一個glError 1282一切正常。 我想嘗試GL_RGBA16F_EXT,但這不包含在GLES30中。所以,我想通過價值0x881A這就是GL_RGBA16F_EXT是如何定義的。但是,同樣的錯誤:glError 1282.

函數eglGetProcAddress有時需要使用OpenGL ES擴展,但由於我不需要函數的地址,我懷疑這也不會幫助我。我真的不知道接下來要做什麼。我怎樣才能創建浮點型FBO?

回答

1

GL_UNSIGNED_BYTE是不適合的組合中的type參數的glTexImage2D()與用於internalFormat參數的值GL_RGBA16F一個有效值。

根據規範中的表3.2,GL_RGBA16F的唯一有效type值爲GL_HALF_FLOATGL_FLOAT。此調用應該工作:

GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA16F, 512, 512, 0, 
        GLES30.GL_RGBA, GLES30.GL_HALF_FLOAT, null); 

與完整的OpenGL,Op​​enGL ES的有glTexImage2D()一組相當有限的有效format/type/internalFormat組合。作爲本次調用的一部分,它不支持數據類型的自動轉換,超出了規範表3.2中列出的值組合。

這些typeinternalFormat值仍然必須形成有效組合,即使在調用中沒有指定數據。主要是因爲......它是這樣定義的。在我個人看來,這整個glTexImage2D()從來都不是一個好的API設計,它也部分地受到它隨着時間的推移而變化的方式。較新的glTexStorage2D()更清潔。

例如,在這種特定情況下,internalFormat確實會完全指定紋理的存儲格式,因爲GL_RGBA16F是大小格式。所以type似乎是多餘的。但爲了向後兼容,仍舊支持較舊的未格式化格式。如果指定GL_RGBinternalFormat,紋理會,如果你結合起來,與GL_UNSIGNED_BYTEtype使用GL_RGB8內部格式,但是這將是一個GL_RGB565如果typeGL_UNSIGNED_SHORT_5_6_5說。

+0

哦,你是對的。謝謝!我認爲,類型參數與數據參數相關聯,因此,我指定的類型無關緊要,因爲data = null。顯然,我誤解了那裏的一些東西 - 哪個效果有類型參數?內部格式不指定一切,GPU需要知道? – j00hi 2014-09-04 14:55:09

+1

增加了一些內容來嘗試和解釋。即使如此,從邏輯上解釋它也是很難的,因爲這些API的定義方式是一團糟。 – 2014-09-05 06:24:05

相關問題