unity shader实现较完整光照效果

作者:周者 时间:2023-04-27 07:43:29 

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

效果图:

shader被附给了球。

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

unity 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
  • asp之家 软件编程 m.aspxhome.com