2012-10-21 76 views
1

我有一些PVRTC 4bpp圖像數據需要垂直翻轉而不需要解壓縮。我寫的代碼大部分都在工作,但翻蓋目前引入了小的文物,我不確定原因。垂直翻轉PVRTC壓縮圖像數據

PVRTC翻轉代碼首先將8字節4x4壓縮塊移動到它們的翻轉位置,如PowerVR SDK中PVRTDecompress.cpp的TwiddleUV()函數計算的那樣。這部分看起來是正確的。其次,代碼遍歷所有8字節壓縮塊,反轉包含存儲在2bpp中的4x4調製數據的第二個4字節的順序。塊的前4個字節包含保持不變的顏色數據。

這似乎是非常接近正確的,但它在翻轉的圖像中留下了很小的文物,這些文物在原始文件中並不存在,並且大部分體現爲小灰線。如果翻轉代碼運行兩次,則文物將消失,圖像與原始圖像保持不變。

任何具有PVRTC經驗的人都可以解釋還需要做什麼來翻轉壓縮的圖像數據嗎?我認爲這個問題可能與調製數據的翻轉有關,但是我現在對PVRTC文檔的討論並沒有在這個階段得出答案。

+1

出於好奇,你爲什麼不反轉你的紋理座標?爲什麼你需要反轉紋理數據本身? –

+0

@BradLarson:我也想知道,但認爲必須有一個很好的理由。 –

+0

@BradLarson:您當然可以反轉紋理座標,或在壓縮圖像之前翻轉圖像,我有興趣做一些「手動」處理以用於某些離線紋理處理步驟。 –

回答

2

爲了便於理解,您需要知道PVRTC解碼數據的方式,因爲它與ETC1或S3TC/DXTC等基於塊的方案有點不同。爲了簡單起見,我只會描述4bpp變體。

PVRTC由2張低分辨率15/16bpp圖像A和B組成,它們是最終紋理分辨率的1/4 * 1/4,以及全分辨率但是2bpp的調製圖像。爲了在邏輯上解碼紋素,XY,A和B圖像是雙線性地放大到目標分辨率,然後根據調製圖像中的像素混合最終的顏色Axy和Bxy。爲了使解碼在硬件中變得更簡單,A圖像和B圖像與來自調製數據的16個來自調製數據的1個像素的調製數據交錯爲64位字。

現在,它不會完全使用位混洗來翻轉的原因是因爲4x4雙線性高檔稍微偏離了4x4紋素的中心(我認爲原因在圖形硬件2003論文linked from wikipedia中有描述)。我希望你能做的唯一事情是實際評估每個像素,然後在翻轉雙線顏色之後,確定四種可能性中哪一種實際上是最接近的。在某種程度上,這將是一次重新壓縮,但應該相對較快。

+0

我認爲你對這些偏移進行了一些研究,在那篇論文的圖5中,它表明所有的調製數據都需要被移動一行。我會給這個去看看是否有幫助。如果可能的話,我想避免評估,然後重新壓縮/重新創建調製值,因爲這會使垂直翻轉比完全解壓縮更長!謝謝。 –

+0

我看不到將調製數據移動一行將有所幫助。無論使用什麼方案,通常它都是對原始壓縮數據的近似值。我相信您需要調整調製值以適應重新定位的雙線性代表,或者嘗試調整雙線性顏色,以使其最適合。我認爲調整頂點或片段着色器並使用硬件進行翻轉會更容易

+0

我的意思是將兩個低分辨率圖像垂直偏移/重新對齊,等於未壓縮圖像中的一行或低分辨率圖像中的1/4像素,以試圖固定垂直對齊。我認爲這是因爲翻蓋在原始圖像中引入了一些高像素高水平線〜高於硬白/黑轉換的7-8個像素,並且它實際上只是在這些硬轉換區域附近,翻蓋具有視覺問題。 –