這是一個很難搜索的問題。我在 HLSL 中畫一條線,我想根據每個像素的水平坐標定義線的不透明度。
繪制一條垂直線,寬度為 10 像素。最左邊和最右邊的像素應該幾乎完全透明,中心像素完全不透明,并且在兩者之間的某處衰減。在我的著色器中,我將“水平坐標”作為因子 0->1,其中 0 是最左邊,1 是最右邊,我將有一個“羽化”因子,也是 0->1 ,當它為 1.0 時,它應該使邊緣上的線條更柔和,或者在 0.0 時使線條非常銳利。
我意識到一個完全健壯的系統可能需要更多資訊,例如衰減開始和結束的位置。但假設我只想繪制在不同寬度下看起來不錯的標準線條,同時提供單個羽化因子。羽化應該增加衰減范圍,其中 feather=0.5 應該在大約 0.25 處開始左側衰減,而 feather=1.0 會使衰減從線的中心開始。
這是我在 desmos.com/calculator 上玩了一會兒之后想到的。x 是水平系數:
float alpha = min( 1.0, x * 40.0 * (1.0-x) * (1.0 - (feather-0.1)) );
它作業得很好,但我對使用羽化值的方式的衰減行為不滿意。需要將羽化一直調到 0.95 才能使衰減從應該在 0.5 左右的位置開始。
這是外觀的預覽。圓形和藍色線條的羽化度為 0.95,霓虹綠對角線的羽化度為 0.5,可以看出它太粗糙了。所有這些線的寬度都是 10。

那里的數學家有任何關于簡單或更好的方法的建議嗎?如果您有更好的方法來完成它,請隨時完全更改公式。但如果可能的話,請用標準的 ascii 字符發布斜率公式。我不是最擅長數學符號的人。
uj5u.com熱心網友回復:
有很多方法可以實作這樣的功能。一個簡單的方法可以是:
由于您制作的當前 alpha 函式是基于parabolla,
float alpha2 = 1.0f - pow((x - 0.5f) / 0.5f, 2.0f);
通過使用更高的功率來制作更銳利的衰減函式。
float alpha32 = 1.0f - pow((x - 0.5f) / 0.5f, 32.0f);
并根據feather價值混合這兩者。
float alpha = lerp(alpha32, alpha2, feather * feather);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535664.html
標籤:数学片段着色器
下一篇:模擬秘書問題時的意外值
