邊緣光實現

2021-09-19 19:00:32 字數 1281 閱讀 5310

參考**:

**參考: 14 邊緣發光shader(rim shader)的兩種實現形態/basicrimshader.shader

之前也寫過這個文章,參考:

乙個是原理,乙個是使用su***ce shader進行實現。

這裡再重新回顧下原理,如何判斷邊緣?我們知道邊緣的的法線與邊緣點到視點的向量有個夾角。

在邊緣的時候,這個夾角很大。可以利用這個夾角的余弦值衡量。余弦值越小,越靠近邊緣。注意這裡余弦值和夾角是成反比。而我們希望越靠近邊緣其越亮。所以使用1-余弦值,作為係數。然後用這個係數與顏色相乘,作為自發光的顏色。

所謂的自發光,就是物體本身有個顏色,將這個顏色和算出來的其他顏色相加就可以了。

這裡我們不考慮那麼負責,就是用乙個取樣的顏色+自發光顏色,簡單實現表邊緣發光效果。

選擇計算空間為世界空間。

將法線轉換到世界空間:

fixed3 normaldir = normalize(mul(x.normal, (float3x3)unity_worldtoobject));

將模型空間的頂點轉換到世界空間:

o.worldpos= mul(unity_objecttoworld,v.vertex);

視線的計算,在片段著色器中計算:

float3 viewdirection = normalize(_worldspacecamerapos.xyz - i.worldpos.xyz);

shader "myshader/rimshader"

_rimcolor

("rimcolor"

,color)=(

1,1,

1,1)

_rimpower

("rimpower"

,range(0

,16))

=1_rimintensity

("rimintensity"

,range(0

,10))

=1} subshader

lod 100

pass ;

struct v2f

;sampler2d _maintex;

float4 _maintex_st;

uniform float4 _rimcolor;

uniform float _rimpower;

uniform float _rimintensity;

fixed4 frag (v2f i)

: sv_target

endcg

}}}

UnityShader例項03 邊緣光材質

邊緣光材質 邊緣光材質原理和xray材質相類似,shader 也就長得幾乎一樣了 shader 實現 vf版本 01 shader penglu rimlight vf rimcolor rimcolor color 0,1,1,1 rimpower rim power range 0.1,8.0 ...

簡單邊緣泛光處理

前言 本篇部落格只是乙個簡單的實現邊緣泛光功能的例子,主要是當做筆記使用。核心要點 1.使用法向量和視角向量的點積值來獲取明亮度,從模型邊緣到模型中心點積值從0 1變化。點積值為負數說明當前頂點在平面背面,攝像機視角看不到,可以不做明亮度處理。點積值為正值時,說明當前頂點在平面正面,可以結合衰減係數...

Halcon實現邊緣提取

一 邊緣提取 1 設定roi興趣區域 2 快速二值化,並連線相鄰區域。這樣做的目的是進一步減少目標區域,通過二值化將目標區域大概輪廓提取出來 3 提取最接近目標區域的輪廓 常用函式有boundary,gen contour region xld 4 根據自己的需求提取需要的初步輪廓 5 將初步提取的...