假設我有一個紋理,我想做的是對于每個像素,只回傳最大的通道為 1,其余的為 0。
例如:
| INPUT | OUTPUT
------|-------------------------|-----------------
RGBA | (0.5, 0.3, 0.4, 0.3) | (1, 0, 0, 0)
RGBA | ( 0 , 0.8, 0.9, 1 ) | (0, 0, 0, 1)
我正在使用著色器圖,并且正在尋找一種最佳方法來避免使用大量節點。
我的想法是取所有通道中的最大值m,然后讓每個通道c i = (c i >= m),因此大于等于m的通道為 1,其余為 0,但我猜可能成為更好/更高效的方式。
PS:如果有2個或更多的通道值相同,正確無所謂,是紋理的問題。可以假設總會有一個價值最大的渠道。
uj5u.com熱心網友回復:
一種可能的選擇是添加一個小的自定義功能節點。

float check = -1;
if ( inputColour.x > check )
{
check = inputColour.x;
outputColour = float4(1,0,0,0);
}
if ( inputColour.y > check )
{
check = inputColour.y;
outputColour = float4(0,1,0,0);
}
if ( inputColour.z > check )
{
check = inputColour.z;
outputColour = float4(0,0,1,0);
}
if ( inputColour.w > check )
{
outputColour = float4(0,0,0,1);
}
當顏色更接近“紅色”時,節點產生:
但隨著越來越接近“藍色”,節點產生:

編輯
添加以表彰更好的答案。根據@Daniel 的評論,此代碼將產生相同的結果,但沒有if陳述句。而且更容易閱讀!雙贏。
float m = inputColour.x;
m = max(m, inputColour.y);
m = max(m, inputColour.z);
m = max(m, inputColour.w);
outputColour = float4 ( inputColour.x = inputColour.x >= m,
inputColour.x = inputColour.y >= m,
inputColour.x = inputColour.z >= m,
inputColour.x = inputColour.w >= m );
uj5u.com熱心網友回復:
您可以使用 Shader Graph Maximum Node。
回傳兩個輸入值 A 和 B 中的最大值。
Red
RGBA --------
| \
| Maximum -------- Maximum --- (max of R, G, B)
| Green / /
|----------/ /
| /
| Blue /
|----------------------/
選擇
如果您擔心 Shader Graph 的開銷,您可以隨時下拉到 HLSL 級別并使用max(x,y)內部函式。如果您需要其中兩 (2) 個,這是一個簡單的操作。比使用緩慢而討厭的if陳述要好得多。
如果您希望在其他地方使用此類代碼,甚至可以從 Shader Graph 中呼叫它。
uj5u.com熱心網友回復:
如果我明白你想要的不是最大值,而是你想知道實際上具有最大值的紋理是什么,所以我帶著這個......
關于除法的一件事是,如果兩個數字相同,它總是等于一。這也意味著如果被除數小于除數,它將始終回傳 <1,如果除數較小,它將回傳 >1。請記住除數上的 0。
有了它,我認為您可以擺脫 max() 并僅使用 4 個磁區和 4 個樓層 可能對 0 和 ∞ 情況進行一些控制。
我會嘗試這樣的事情:(沒有測驗任何東西)
inputTex1 = float4(r,g,b,a);
inputTex2 = float4(r,g,b,a);
outputTex1 = float4 (
r = ((inputTex1.r / inputTex2.r) >= 1),
g = ((inputTex1.r / inputTex2.r) >= 1),
b = ((inputTex1.r / inputTex2.r) >= 1),
a = ((inputTex1.r / inputTex2.r) >= 1));
outputTex2 = float4 (
r = ((inputTex1.r / inputTex2.r) <= 1),
g = ((inputTex1.r / inputTex2.r) <= 1),
b = ((inputTex1.r / inputTex2.r) <= 1),
a = ((inputTex1.r / inputTex2.r) <= 1));
`
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/531562.html
上一篇:初識設計模式 - 訪問者模式
