2012-11-05 112 views
1

我在OpenGL中加載透明alpha的DDS圖像(DXT5)。由於alpha不是預乘,並且不能根據DXT5 specs進行預倍乘,所以我在紋理的可見部分周圍形成了薄黑色暈圈,因爲我在GPU上執行了一些混合操作。我的問題是:什麼是最佳解決方法我的OpenGL渲染器更新每個幀上的場景紋理,加載那些來自IO的場景紋理,所以如果我先解壓縮DDS然後預先多層壓縮,然後壓縮回來,我得到了巨大的開銷。我認爲另一個選項是添加另一個渲染通道並執行pre - 在片段着色器中進行渲染並渲染到紋理,然後將其用於主通道。由於我已經有通道的下降數量,因此會在整個管道中增加開銷。此處還有哪些其他選項?DXT5的預乘alpha值

+1

「*我的OpenGL渲染器更新每個幀上的場景紋理,加載那些來自IO *」您正在每幀加載和壓縮紋理?爲什麼? –

+0

在這裏不能解釋,因爲它是商業的東西,但這是特殊用途的renderer.It應該這樣工作:) –

+0

也就是說,順便說一句,我在這裏使用DDS的原因 - 加快上傳時間。對不起,我我沒有實時壓縮紋理。我加載了準備好的DDSs –

回答

0

問題解決了。我有一個損壞的DDS紋理。我在默認情況下在片段着色器中執行的手動預乘法與有效的DXT5完美匹配。

0

爲什麼不只是讓你的着色器在現場進行alpha預乘,然後做你通常要做的事情?

沒有必要將其渲染到紋理。只需總是在您的着色器中預乘,對於全部紋理,您需要預乘。

+0

這沒有幫助。這就是爲什麼我正在嘗試變通方法......順便說一下,它並沒有幫助,因爲它發生在MSAA中,所以傳遞的是未加調整的DDS紋理數據得到插值並用細的黑色邊框設置這個令人討厭的光環。我發現GL_NEAREST會將其去除,但如果紋理應用的平面縮放一點,它會增加邊緣像素化。 –

+0

您不能多重採樣DDS紋理(除非您正在手動*,在這種情況下,它不再是多重採樣)。所以目前還不清楚你在說什麼。 –

+0

默認情況下,我運行幾次pass.The首先是MSAA.I渲染幾何在那個傳遞與DDS紋理。現在當你說我不能這樣做,可能是這個問題?我的意思是黑色光環來自事實我在帶有alpha通道的DDS上做MSAA? –