2017-07-14 55 views
1

我使用ARB_sparse_texture extension呈現實時立體效果,使用非常大的虛擬3D紋理。glGenerateMipmap()與ARB_sparse_texture擴展

而且我可以找到關於它如何與自動紋理貼圖代(glGenerateMipmap())進行交互的任何信息。

我正確地用數據填充紋理的0級,並正確提交使用的塊。一切運作良好,但我也需要這種紋理的mipmap鏈,我不知道如何自動完成它(我發現它在spec for ARB_sparse_texturespec for ARB_sparse_texture2)。

,如果我只是填補了0級後使用glGenerateMipmap()會發生什麼? (我試過了,它開始大幅失速)

我應該手動計算並提交所有在較粗糙級別使用的塊,並且還使用計算着色器手動下采樣數據? (最壞的變種,它是太多額外的工作)

有沒有什麼簡單的方法來做到這一點(如glGenerateMipmap()與正常紋理)?

+1

@genpfault:[提問者發表的評論](https://stackoverflow.com/questions/45107006#comment77197450_45107902)顯示在鏈接中使用描述性詞語(例如,「ARB_sparse_texture規範」)是多麼有益比「隱藏」在運行文本(例如,「在」字和「規範」的背後)這些鏈接。 –

+0

@PeterO:不夠公平,對我的作品! – genpfault

回答

1

稀疏內存和mipmap生成之間的交互是相當明顯的。 glGenerateMipmaps從基本mipmap級別讀取數據,並將其寫入所有級別,包括最大級別。使用稀疏內存時,從未提交頁面讀取產生未定義數據,寫入未提交頁面不起作用。

因此,如果在基準級中有未提交的頁面,則從其下采樣將產生未定義的結果。如果mipmap鏈中存在未提交的頁面,則寫入它們將不會執行任何操作。由於稀疏紋理擴展不會改變glGenerateMipmaps的指定行爲,因此生成過程將執行其讀取和寫入,而不知道哪些頁面已提交。

基本上,如果你要調用glGenerateMipmaps,存在具有質地稀疏的小點。除非你編寫未定義的值來降低mipmap級別。

我試了一下,就開始拖延大幅

嗯,是的。你期望什麼? glGenerateMipmaps內部使用渲染管道或計算着色器。無論哪種方式,它實際上是一個渲染命令,所以它不完全是一個輕量級的操作。

+0

感謝您的回答。 你不完全正確的約undefined data in uncommited regions。 根據更新後的規範(https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_sparse_texture2.txt)從着色器中的uncommited區域讀取返回零,這對我來說是合適的。但是再次沒有關於glGenerateMipmap的說法,它是否與基於着色器的渲染行爲不符?對我而言,這並不明顯。 – simpetar

+0

簡而言之,你的意思是我應該手動計算並提交更粗糙級別的所有使用的塊,然後(在承諾所有塊之後)可以使用glGenerateMipmap()自動縮減採樣,並且在此之後它將至少是正確的緩慢,因爲它試圖縮小一切,甚至無限的區域)? – simpetar

+0

我期待什麼?我有一個非常非常微小的希望,它的行爲邏輯上並且爲我做了所有骯髒的工作(計算並提交只需要的塊和僅下載現有數據)。在稀疏分配紋理的情況下,對於高級自動mipmap生成函數來說,這是絕對正常的行爲。但唉... – simpetar