Unity Shader如何通过描边技术实现OutLine效果?

更新于
2026-10-10 18:23:35
324阅读来源:SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计717个文字,预计阅读时间需要3分钟。

Unity Shader如何通过描边技术实现OutLine效果?

原文示例:本文字例为大家分享了Unity Shader实现描边Outline效果的总体代码,供大家参考。具体内容如下:

Shader实现描边Outline效果的流程大致如下:

1. 对模型进行2遍绘制(2个pass)绘制,第一个pass(描边pass)在vertex shader中:

cShader Custom/OutlineShader{ Properties { _MainTex (Texture, 2D)=white {} _OutlineColor (Outline Color, Color)=(1,1,1,1) _OutlineWidth (Outline Width, Range(0.01, 0.5))=0.1 } SubShader { Tags { RenderType=Opaque } LOD 100

Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag

#include UnityCG.cginc

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldPos : TEXCOORD1; };

sampler2D _MainTex; float4 _OutlineColor; float _OutlineWidth;

v2f vert (appdata v) { v2f o; o.vertex=UnityObjectToClipPos(v.vertex); o.uv=TRANSFORM_TEX(v.uv, _MainTex); o.worldPos=mul(unity_ObjectToWorld, v.vertex).xyz; return o; }

fixed4 frag (v2f i) : SV_Target { fixed4 col=tex2D(_MainTex, i.uv); return col; } ENDCG } } FallBack Diffuse}

2. 第二个pass绘制模型本身:

cPass{ CGPROGRAM #pragma vertex vert #pragma fragment frag

#include UnityCG.cginc

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldPos : TEXCOORD1; };

sampler2D _MainTex; float4 _OutlineColor; float _OutlineWidth;

Unity Shader如何通过描边技术实现OutLine效果?

v2f vert (appdata v) { v2f o; o.vertex=UnityObjectToClipPos(v.vertex); o.uv=TRANSFORM_TEX(v.uv, _MainTex); o.worldPos=mul(unity_ObjectToWorld, v.vertex).xyz; return o; }

fixed4 frag (v2f i) : SV_Target { fixed4 col=tex2D(_MainTex, i.uv); return col; } ENDCG}

以上代码仅为示例,具体实现可能需要根据实际需求进行调整。

本文实例为大家分享了Unity Shader实现描边OutLine效果的具体代码,供大家参考,具体内容如下

Shader实现描边流程大致为:对模型进行2遍(2个pass)绘制,第一遍(描边pass)在vertex shader中对模型沿顶点法线方向放大,fragment shader设置输出颜色为描边颜色;第二遍正常绘制模型,除被放大的部分外,其余被覆盖,这样就有了描边的效果。

实现代码如下:

Shader "Custom/OutlineShader" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _OutLineWidth("width", float) = 1.2//定义一个变量 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex:POSITION; float2 uv:TEXCOORD0; }; struct v2f { float2 uv :TEXCOORD0; float4 vertex:SV_POSITION; }; float _OutLineWidth;//设置变量 v2f vert(appdata v) { v2f o; //设置一下xy //v.vertex.xy *= 1.1; v.vertex.xy *= _OutLineWidth;//乘上变量 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; fixed4 frag(v2f i) :SV_Target { fixed4 col = tex2D(_MainTex, i.uv); //return col; return fixed4(0, 0, 1, 1); } ENDCG } Pass { ZTest Always CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex:POSITION; float2 uv:TEXCOORD0; }; struct v2f { float2 uv :TEXCOORD0; float4 vertex:SV_POSITION; }; v2f vert(appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; fixed4 frag(v2f i) :SV_Target { fixed4 col = tex2D(_MainTex, i.uv); //return fixed4(0, 0, 1, 1);//返回蓝色,因为再次渲染会把第一个颜色覆盖掉 return col; } ENDCG } } FallBack "Diffuse" }

物体被遮挡,仍然需要显示,需要设置描边pass的语句ZTest为Always,深度检测一直通过,这样描边pass的片段不会被深度剔除。

运行效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计717个文字,预计阅读时间需要3分钟。

Unity Shader如何通过描边技术实现OutLine效果?

原文示例:本文字例为大家分享了Unity Shader实现描边Outline效果的总体代码,供大家参考。具体内容如下:

Shader实现描边Outline效果的流程大致如下:

1. 对模型进行2遍绘制(2个pass)绘制,第一个pass(描边pass)在vertex shader中:

cShader Custom/OutlineShader{ Properties { _MainTex (Texture, 2D)=white {} _OutlineColor (Outline Color, Color)=(1,1,1,1) _OutlineWidth (Outline Width, Range(0.01, 0.5))=0.1 } SubShader { Tags { RenderType=Opaque } LOD 100

Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag

#include UnityCG.cginc

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldPos : TEXCOORD1; };

sampler2D _MainTex; float4 _OutlineColor; float _OutlineWidth;

v2f vert (appdata v) { v2f o; o.vertex=UnityObjectToClipPos(v.vertex); o.uv=TRANSFORM_TEX(v.uv, _MainTex); o.worldPos=mul(unity_ObjectToWorld, v.vertex).xyz; return o; }

fixed4 frag (v2f i) : SV_Target { fixed4 col=tex2D(_MainTex, i.uv); return col; } ENDCG } } FallBack Diffuse}

2. 第二个pass绘制模型本身:

cPass{ CGPROGRAM #pragma vertex vert #pragma fragment frag

#include UnityCG.cginc

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldPos : TEXCOORD1; };

sampler2D _MainTex; float4 _OutlineColor; float _OutlineWidth;

Unity Shader如何通过描边技术实现OutLine效果?

v2f vert (appdata v) { v2f o; o.vertex=UnityObjectToClipPos(v.vertex); o.uv=TRANSFORM_TEX(v.uv, _MainTex); o.worldPos=mul(unity_ObjectToWorld, v.vertex).xyz; return o; }

fixed4 frag (v2f i) : SV_Target { fixed4 col=tex2D(_MainTex, i.uv); return col; } ENDCG}

以上代码仅为示例,具体实现可能需要根据实际需求进行调整。

本文实例为大家分享了Unity Shader实现描边OutLine效果的具体代码,供大家参考,具体内容如下

Shader实现描边流程大致为:对模型进行2遍(2个pass)绘制,第一遍(描边pass)在vertex shader中对模型沿顶点法线方向放大,fragment shader设置输出颜色为描边颜色;第二遍正常绘制模型,除被放大的部分外,其余被覆盖,这样就有了描边的效果。

实现代码如下:

Shader "Custom/OutlineShader" { Properties { _MainTex ("Albedo (RGB)", 2D) = "white" {} _OutLineWidth("width", float) = 1.2//定义一个变量 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex:POSITION; float2 uv:TEXCOORD0; }; struct v2f { float2 uv :TEXCOORD0; float4 vertex:SV_POSITION; }; float _OutLineWidth;//设置变量 v2f vert(appdata v) { v2f o; //设置一下xy //v.vertex.xy *= 1.1; v.vertex.xy *= _OutLineWidth;//乘上变量 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; fixed4 frag(v2f i) :SV_Target { fixed4 col = tex2D(_MainTex, i.uv); //return col; return fixed4(0, 0, 1, 1); } ENDCG } Pass { ZTest Always CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex:POSITION; float2 uv:TEXCOORD0; }; struct v2f { float2 uv :TEXCOORD0; float4 vertex:SV_POSITION; }; v2f vert(appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; fixed4 frag(v2f i) :SV_Target { fixed4 col = tex2D(_MainTex, i.uv); //return fixed4(0, 0, 1, 1);//返回蓝色,因为再次渲染会把第一个颜色覆盖掉 return col; } ENDCG } } FallBack "Diffuse" }

物体被遮挡,仍然需要显示,需要设置描边pass的语句ZTest为Always,深度检测一直通过,这样描边pass的片段不会被深度剔除。

运行效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。