2013-02-08 22 views
6

我需要序列化一個任意的OpenGL紋理對象,以便能夠在稍後用相同的狀態和數據恢復它。如何在OpenGL中獲取原始(未轉換)的紋理數據?

我正在尋找一種方法來獲取紋理圖像數據。這是我迄今爲止發現的:

  • 還有glGetTexImage

    它允許獲取紋理圖像,但它需要一個指定的格式/類型對(像(GL_RGB,  GL_HALF_FLOAT)其所執行轉換。

    允許的格式和類型不映射1 :1至圖像格式雖然,並且將不允許獲得更多的晦澀格式,如GL_R3_G3_B2無需額外的轉換

    而且正確地確定用於基礎內部格式(如GL_RGB沒有尺寸)C類型涉及一些非平凡的勞動。

  • ARB_internalformat_query2允許要求GL_GET_TEXTURE_IMAGE_FORMATGL_GET_TEXTURE_IMAGE_TYPE哪些代表給定紋理glGetTexImage的最佳選擇。

    不錯,但有和glGetTexImage相同的侷限性,並且沒有廣泛使用。

  • 精彩的glGetCompressedTexImage優雅地返回壓縮紋理的數據,但它既不適用於非壓縮圖像也不適用於對應的。

這些都不允許獲取或設置非壓縮紋理的原始數據。有沒有辦法?

回答

2

訣竅是,找到匹配的格式和類型,產生正確的數據佈局。

雖然允許的格式和類型不會將1:1映射爲圖像格式,但不會允許在沒有額外轉換的情況下獲得更多不明顯的格式,如GL_R3_G3_B2。

這將是GL_RGB,GL_UNSIGNED_BYTE_3_3_2

而且正確地確定用於基地內部格式C的類型(如GL_RGB沒有大小)涉及一些非平凡的勞動。

是的。 *戴上太陽鏡*處理它! ;)

至於內部格式。我特此refer you to

glGetTexLevelParameter(GL_TEXTURE_…, …, GL_TEXTURE_INTERNAL_FORMAT,…); 
glGetTexLevelParameter(GL_TEXTURE_…, …, GL_TEXTURE_{RED,GREEN,BLUE,ALPHA,DEPTH}_TYPE, …); 
glGetTexLevelParameter(GL_TEXTURE_…, …, GL_TEXTURE_{RED,GREEN,BLUE,ALPHA,DEPTH}_SIZE, …); 
+0

Dankeschön!現在我知道我在處理什麼。我一直在努力把*這件東西*放在一起(https://gist.github.com/Kos/4739337),我呃期待着測試它。而且我無法找到像RGB10或RGBA2等格式的完美匹配。我希望我有'ARB_internalformat_query2'來驗證所有這些容易... – Kos 2013-02-08 14:42:24