2015-10-01 38 views
1

有人請解釋爲什麼使用預乘α(和修正後的混合函數)進行渲染與「正常」alpha的渲染看起來不同,在數學上講,這些是相同的?請解釋預乘alpha的工作原理

我已經研究過這個職位預乘alpha的理解:

http://blogs.msdn.com/b/shawnhar/archive/2009/11/06/premultiplied-alpha.aspx

筆者還表示,最終的計算是一樣的:

「看看混合式傳統如果將此顏色格式轉換替換爲預乘的混合函數,則可以得到傳統的混合函數,因此任何一種方式都會產生相同的最終結果。不同之處在於,預乘alpha將應用(source.rgb * source.a )計算作爲預處理而不是混合硬件內部。「

我錯過了什麼嗎?爲什麼結果不同呢?

neshone

+0

您需要使用預倍乘內容與預倍乘混合,以及未預倍乘內容與非預倍乘混合。否則你會得到錯誤的結果。如果您使用了正確的內容,並使用了正確的方程,那麼您會得到正確的行爲。 – fadden

+0

您應該提供更多關於迄今爲止獲得的結果差異的信息,以獲得一些幫助。 – tonso

+0

我其實並不想修正一個錯誤或任何東西。在使用之前,我實際上首先想了解它,但是我發現網絡上的信息有點令人困惑。這就是我發佈這個問題的原因。我還想了解,如果您可以在運行時在沒有預乘資源的情況下實現相同的效果,並且在資源加載期間沒有進行修改......任何有用的資源? – neshone

回答

1

這是一種猜測,因爲沒有足夠的信息還沒有弄明白。

它應該是一樣的。獲得不同價值的一種常見方式是在預乘步和渲染步驟之間使用不同的Gamma校正方法。

我會猜測你的一個階段,混合或預乘階段正在用不同的伽瑪值完成。如果使用類似DirectXTex texconv的工具生成預乘的紋理,並使用默認的srgb選項來預乘alpha,則採樣器需要爲_SRGB格式,並且渲染目標也應該爲_SRGB。如果您正在線性對待它們,那麼即使您正在使用相同着色器中的預乘(取決於3D API並呈現目標設置差異),也可能無法渲染到_SRGB目標或採用伽馬校正對紋理進行採樣, 。這樣做會使alpha在中間色調中的兩種方法之間顯着不同。

參見:http://http.developer.nvidia.com/GPUGems3/gpugems3_ch24.html

如果生成在Photoshop中的α,那麼你應該知道的幾件事情。 Photoshop不會以線性或sRGB格式保存Alpha。它將其保存爲線性和sRGB之間約一半的Gamma值。如果你在photoshop中預乘,它會正確計算預乘數,但保存結果的錯誤斜坡。如果你生成一個正常的阿爾法,然後在你的3D API中將其作爲sRGB或LINEAR進行採樣,它將會接近,但無論哪種情況都不會與photoshop顯示的值相匹配。

想要更深入地回覆我們需要的信息。

  • 你使用的是什麼3d API。
  • 你的紋理如何生成和採樣
  • 什麼時候以及如何預乘alpha。
  • 並且最好是顯示錯誤的代碼或着色器示例。
1

我是研究爲什麼人們會使用前與非前,發現了這個有趣的信息來自Nvidia

https://developer.nvidia.com/content/alpha-blending-pre-or-not-pre

看來,他們的具體情況下使用時前,在後期有更精確Α。

我也讀過(我相信在這裏,但無法找到它),做前alpha(這是每個RGB值乘以阿爾法),你會節省時間。我仍然需要知道這是否正確,但似乎有一個原因是爲什麼pre-alpha更受歡迎。