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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

unity 半透明混合问题_Unity Shader 透明度混合的双面渲染(十八)

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity 半透明混合问题_Unity Shader 透明度混合的双面渲染(十八) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果:

雙面渲染的透明度混合的物體.png

原圖:

transparent_texture.png

Shader代碼:

Shader中2個Pass代碼一樣,一個只渲染背面,一個只渲染正面

// 透明度混合的雙面渲染

// 2個Pass代碼一樣,一個只渲染背面,一個只渲染正面

Shader "Custom/Transparent/AlphaBlendBirthSided"

{

Properties

{

_Color ("Color", Color) = (1, 1, 1, 1)

_MainTex ("MainTex", 2D) = "white" { }

// 透明度

_Cutoff ("AlpheCutoff", Range(0, 1)) = 0.5

}

SubShader

{

Tags { "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }

pass

{

Tags { "LightMode" = "ForwardBase" }

// Back(默認): 背對著攝像機的圖元不會渲染

// Front: 朝向攝像機的圖元不會渲染

// Off: 關閉剔除功能,所有圖元都會渲染

Cull Front // 只渲染背面

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "Lighting.cginc"

fixed4 _Color;

sampler2D _MainTex;

float4 _MainTex_ST;

fixed _Cutoff;

// 應用傳遞給頂點著色器的數據

struct a2v

{

float4 vertex: POSITION;

float3 normal: NORMAL;

float4 texcoord: TEXCOORD0;

};

// 頂點著色器傳遞給片元著色器的數據

struct v2f

{

float4 pos: SV_POSITION;

float3 worldNormal: TEXCOORD0;

float worldPos: TEXCOORD1;

float2 uv: TEXCOORD2;

};

// 頂點著色器

v2f vert(a2v v)

{

v2f o;

// 將頂點坐標從模型空間變換到裁剪空間

// 等價于o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

o.pos = UnityObjectToClipPos(v.vertex);

// 將法線從模型空間變換到時間空間

// 等價于o.worldNormal = normalize(mul(unity_ObjectToWorld, v.normal));

o.worldNormal = UnityObjectToWorldNormal(v.normal);

// 將頂點坐標從模型空間變換到世界空間

o.worldPos = mul(unity_ObjectToWorld, v.vertex);

// 獲取紋理uv坐標

// 等價于o.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

return o;

}

// 片元著色器

fixed4 frag(v2f i): SV_TARGET

{

// 獲得世界空間下光照方向

fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

fixed4 texColor = tex2D(_MainTex, i.uv);

// 透明度測試

clip(texColor.a - _Cutoff);

// 主紋理顏色

fixed3 albedo = texColor.rgb * _Color.rgb;

// 環境光

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

// 計算漫反射

// 蘭伯特公式:Id = Ip * Kd * N * L

// IP:入射光的光顏色;

// Kd:漫反射系數 ( 0 ≤ Kd ≤ 1);

// N:單位法向量,

// L:單位光向量

fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(i.worldNormal, worldLightDir));

return fixed4(ambient + diffuse, 1.0);

}

ENDCG

}

pass

{

Tags { "LightMode" = "ForwardBase" }

// Back(默認): 背對著攝像機的圖元不會渲染

// Front: 朝向攝像機的圖元不會渲染

// Off: 關閉剔除功能,所有圖元都會渲染

Cull Back // 只渲染正面

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "Lighting.cginc"

fixed4 _Color;

sampler2D _MainTex;

float4 _MainTex_ST;

fixed _Cutoff;

// 應用傳遞給頂點著色器的數據

struct a2v

{

float4 vertex: POSITION;

float3 normal: NORMAL;

float4 texcoord: TEXCOORD0;

};

// 頂點著色器傳遞給片元著色器的數據

struct v2f

{

float4 pos: SV_POSITION;

float3 worldNormal: TEXCOORD0;

float worldPos: TEXCOORD1;

float2 uv: TEXCOORD2;

};

// 頂點著色器

v2f vert(a2v v)

{

v2f o;

// 將頂點坐標從模型空間變換到裁剪空間

// 等價于o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

o.pos = UnityObjectToClipPos(v.vertex);

// 將法線從模型空間變換到時間空間

// 等價于o.worldNormal = normalize(mul(unity_ObjectToWorld, v.normal));

o.worldNormal = UnityObjectToWorldNormal(v.normal);

// 將頂點坐標從模型空間變換到世界空間

o.worldPos = mul(unity_ObjectToWorld, v.vertex);

// 獲取紋理uv坐標

// 等價于o.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

return o;

}

// 片元著色器

fixed4 frag(v2f i): SV_TARGET

{

// 獲得世界空間下光照方向

fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

fixed4 texColor = tex2D(_MainTex, i.uv);

// 透明度測試

clip(texColor.a - _Cutoff);

// 主紋理顏色

fixed3 albedo = texColor.rgb * _Color.rgb;

// 環境光

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

// 計算漫反射

// 蘭伯特公式:Id = Ip * Kd * N * L

// IP:入射光的光顏色;

// Kd:漫反射系數 ( 0 ≤ Kd ≤ 1);

// N:單位法向量,

// L:單位光向量

fixed3 diffuse = _LightColor0.rgb * albedo * saturate(dot(i.worldNormal, worldLightDir));

return fixed4(ambient + diffuse, 1.0);

}

ENDCG

}

}

}

總結

以上是生活随笔為你收集整理的unity 半透明混合问题_Unity Shader 透明度混合的双面渲染(十八)的全部內容,希望文章能夠幫你解決所遇到的問題。

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