unity shader实现较完整光照效果
作者:周者 时间:2023-04-27 07:43:29
本文实例为大家分享了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"
}
来源:https://blog.csdn.net/u013749051/article/details/85986593
标签:unity,shader,光照
0
投稿
猜你喜欢
java语言图形用户登录界面代码
2021-09-11 23:19:34
MyBatis Plus 入门使用详细教程
2023-08-23 05:48:33
SpringBoot JdbcTemplate批量操作的示例代码
2023-05-15 21:46:42
Java全面分析面向对象之继承
2023-11-23 11:55:59
java.nio.file.WatchService 实时监控文件变化的示例代码
2021-10-03 01:52:53
解读java try catch 异常后还会继续执行吗
2022-05-11 01:25:24
Java实现经典游戏复杂迷宫
2021-05-29 22:33:34
SpringBoot 配置文件加密的步骤
2023-10-23 02:55:55
Java关键字详解之final static this super的用法
2022-01-19 09:24:39
浅谈Spring中Bean的作用域、生命周期
2023-11-14 02:44:21
一文带你了解RabbitMQ消息转换器
2023-11-15 23:22:28
Springboot使用POI实现导出Excel文件示例
2021-09-22 08:18:31
java二维数组基础知识详解
2023-03-28 11:10:54
解决java 分割字符串成数组时,小圆点不能直接进行分割的问题
2023-11-05 03:13:24
java实现简单的验证码功能
2023-08-06 09:21:44
Java虚拟机JVM性能优化(三):垃圾收集详解
2021-10-16 10:38:49
Java并发包线程池ThreadPoolExecutor的实现
2022-11-10 09:52:41
java内存优化的方法总结
2022-12-01 22:25:20
Java 数据结构与算法系列精讲之排序算法
2023-11-01 13:25:40
Java实现简单员工管理系统
2021-12-13 17:51:26