欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

unity shader实现较完整光照效果

时间:2021-05-17 08:41:47|栏目:.NET代码|点击:

本文实例为大家分享了unity shader实现光照效果的具体代码,供大家参考,具体内容如下

效果图:

shader被附给了球。

灯光需要在属性面板开启阴影。

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unlit/lightFull"
{
 Properties
 {
 _MainTex ("Texture", 2D) = "white" {}
 }
 SubShader
 {
 Tags { "RenderType"="Opaque" }
 LOD 100

 Pass
 {
 Tags{"LightMode" = "ForwardBase"}
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 // make fog work
 #pragma multi_compile_fwdbase
 
 #include "UnityCG.cginc"
 #include "Lighting.cginc"
 #include "AutoLight.cginc"
 struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 float3 normal : NORMAL;
 };

 struct v2f
 {
 float2 uv : TEXCOORD0;
 float4 pos : POSITION;
 float4 pos_world : TEXCOORD1;
 float3 normal:TEXCOORD2;
 SHADOW_COORDS(3)
 };

 sampler2D _MainTex;
 float4 _MainTex_ST;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.pos_world = mul(UNITY_MATRIX_M, v.vertex);
 o.normal = v.normal;
 o.pos = UnityObjectToClipPos(v.vertex);
 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
 TRANSFER_SHADOW(o);
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 // sample the texture
 fixed4 col = tex2D(_MainTex, i.uv);
 float4 lightColor = _LightColor0;
 float3 lightDir = WorldSpaceLightDir(i.pos_world);
 UNITY_LIGHT_ATTENUATION(atten, i, i.pos_world.xyz);
 return col * lightColor * saturate(dot(lightDir, i.normal)) * atten;
 }
 ENDCG
 }
 pass
 {
 Tags{"LightMode" = "ForwardAdd"}
 Blend One One
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 #pragma multi_compile_fwdadd_fullshadows
 
 #include "UnityCG.cginc"
 #include "Lighting.cginc"
 #include "AutoLight.cginc"
 struct v2f
 {
 float4 pos : POSITION;
 float4 vertex : TEXCOORD0;
 float3 normal : NORMAL;
 SHADOW_COORDS(2)
 };

 v2f vert(appdata_full data)
 {
 v2f v;
 v.pos = UnityObjectToClipPos(data.vertex);
 v.vertex = mul(UNITY_MATRIX_M, data.vertex);
 v.normal = data.normal;
 TRANSFER_SHADOW(v);
 return v;
 }

 float4 frag(v2f v) :SV_Target
 {
 float3 lightColor = _LightColor0;
#ifdef USING_DIRECTIONAL_LIGHT
 float3 lightDir = _WorldSpaceLightPos0;
#else
 float3 lightDir = _WorldSpaceLightPos0 - v.vertex;
#endif
 UNITY_LIGHT_ATTENUATION(atten, v, v.vertex.xyz);
 float3 color = lightColor * saturate(dot(lightDir, v.normal) * atten);
 return float4(color, 1);
 }
 ENDCG
 }
 }
 Fallback "Specular"
}

上一篇:结合.net框架在C#派生类中触发基类事件及实现接口事件

栏    目:.NET代码

下一篇:C#多线程学习之(一)多线程的相关概念分析

本文标题:unity shader实现较完整光照效果

本文地址:http://www.codeinn.net/misctech/123396.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有