日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.顶点外扩方法实现的描边shader

發布時間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3.顶点外扩方法实现的描边shader 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描邊shader的實現有很多種,頂點外擴是其中之一。頂點外擴的原理是用2個Pass 渲染物體2次

第一遍:描邊,頂點沿法線方向外拓后用黑色渲染。外擴這一步的實現是在投影空間,也就是2D的,根絕法線的x和y值進行外擴,因為是沿著法線方向外擴,所以法線越和攝像機方向相同,也就是越接近面向攝像機的頂點,頂點的位置變化的越小,當法線和攝像機方向相同時,不會有任何變化。

第一遍渲染后,實際的圖像如下:

第二遍:正常渲染物體,與第一遍渲染的混合在一起



優點:
(1)效果最好。
(2)適用范圍廣。
缺點:
(1)對效率有一定影響。因為有2個Pass,所以DrawCall為正常的2倍

(2)對于法線過度不均勻的模型,比如立方體,輪廓會有縫隙。


上邊的立方體例子我是特意把描邊的外擴值調到很大,便于理解。由第一遍渲染后的圖和第二遍渲染后的圖的對比,很容易理解這個方法的原理。其實就是通過法線來把邊緣進行位移,如果不是邊緣,則不位移,比如立方體的正面。在第二次渲染后,會覆蓋同位置的像素,因為邊緣已經外擴,像素的位置已經不是原來的位置,因此不會被覆蓋,而像位于立方體正面的像素,則會被第二次渲染時覆蓋,最后就混合成了帶黑邊的效果圖。


Shader "Study/3_OutLine" {Properties{_MainTex("Texture", 2D) = "white"{}_LineSize("OutlineSize", range(0, 0.1)) = 0.02_LineColor("LineColor", Color) = (0,0,0,1)}SubShader{Pass{Tags{ "LightMode" = "Always" }// 先繪制這個純色的頂點,然后在下一個pass繪制對象//這里不存在前后面,關閉裁剪前后面,也不需要深度緩存Cull Off // 關閉剔除,模型前后都會顯示ZWrite Off // 系統默認是開的,要關閉。關閉深度緩存,后渲染的物體會根據ZTest的結果將自己渲染輸出寫入ZTest Always // 深度測試[一直顯示],被其他物體擋住后,此pass繪制的顏色會顯示出來CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _LineSize;float4 _LineColor;struct v2f{float4 pos:SV_POSITION;float4 color : COLOR;};v2f vert(appdata_full v){v2f o;// 獲取模型的最終的投影坐標o.pos = mul(UNITY_MATRIX_MVP, v.vertex);// UNITY_MATRIX_IT_MV為【模型坐標-世界坐標-攝像機坐標】【專門針對法線的變換】// 法線乘以MV,將模型空間 轉換 視圖空間float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);// 轉換 視圖空間 到 投影空間 【3D轉2D】float2 offset = TransformViewToProjection(norm.xy);// 得到的offset,模型被擠的非常大,然后乘以倍率o.pos.xy += offset * _LineSize;o.color = _LineColor;return o;}float4 frag(v2f i) : COLOR{return i.color;}ENDCG}Pass{// 直接使用頂點和片段shader顯示物體CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;float4 _MainTex_ST;struct v2f {float4 pos:SV_POSITION;float2 uv : TEXCOORD0;// 紋理,相對自身的坐標軸,float2是一個平面};v2f vert(appdata_full v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}float4 frag(v2f i) : COLOR{float4 texCol = tex2D(_MainTex, i.uv);return texCol;}ENDCG}} }
附上工程連接:http://download.csdn.net/detail/yinfourever/9565336


總結

以上是生活随笔為你收集整理的3.顶点外扩方法实现的描边shader的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。