[英]Blend mode with alpha
我正在嘗試復制混合模式。 目前我已經重新創建了一個屏幕混合模式,但它似乎不適用於透明圖像。
我有兩個紋理
圖 1(前景)
圖 2(背景)
我得到的結果是這樣的
計算着色器代碼
#pragma kernel Blend
RWTexture2D<float4> Result;
Texture2D<float4> TopLayer;
Texture2D<float4> BottomLayer;
[numthreads(8, 8, 1)]
void Blend(uint3 id : SV_DispatchThreadID)
{
if (TopLayer[id.xy].w == 0 && BottomLayer[id.xy].w > 0)
{
Result[id.xy] = BottomLayer[id.xy];
}
else if (BottomLayer[id.xy].w == 0 && TopLayer[id.xy].w > 0)
{
Result[id.xy] = TopLayer[id.xy];
}
else if (BottomLayer[id.xy].w == 0 && TopLayer[id.xy].w == 0)
{
Result[id.xy] = float4(0, 0, 0, 0);
}
else
{
float alpha_final = BottomLayer[id.xy].w + TopLayer[id.xy].w - BottomLayer[id.xy].w * TopLayer[id.xy].w;
float4 tex = 1 - (1 - TopLayer[id.xy]) * (1 - BottomLayer[id.xy]);
Result[id.xy] = float4(tex.x, tex.y, tex.z, alpha_final);
}
}
如何正確混合具有不同 alpha 的圖像?
與 Alpha 通道混合需要使用 Alpha 值進行加權。
我之前沒有想過如何在屏幕混合情況下正確加權,這是一種乘法合成。 我認為像加權幾何平均值一樣做是有意義的: https://en.m.wikipedia.org/wiki/Weighted_geometric_mean ):將被乘數提高到相應權重(alpha值)的冪,然后提高結果是權重之和的倒數的冪。 因為我們想要復制兩個 alpha 都為 1 的標准情況:
1 - (1-a) (1-b)
其中沒有平方根,我們將 alpha 值的總和除以 2:
1 - [ (1-a) wa (1-b) wb ] 2/(wa+wb)
output alpha 通道本身可以以相同的方式計算,或者可以是兩個 alpha 值的簡單最大值。 我不知道什么會更好看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.