首页 > 其他分享 >Unity Shader标准光照模型的实现

Unity Shader标准光照模型的实现

时间:2023-02-22 15:00:33浏览次数:45  
标签:normalize 1.0 Shader fixed3 Unity position fixed 光照

 1 Shader "Custom/P_Illumination"
 2 {
 3     Properties{
 4         _BasicColor("基础颜色",Color)=(1.0,1.0,1.0,1.0)
 5         _SpecularColor("高光颜色",Color)=(0,0,0,0)
 6         _SpecularPow("高光范围",Range(1,256))=50
 7         _DiffuseChoice("兰伯特<——>半兰伯特",Range(0,1))=0
 8         _SpecularChoice("Phone<——>Blinn",Range(0,1))=0
 9     }
10     SubShader
11     {
12         Pass
13         {
14             tags{
15                 "LightMode"="ForwardBase"
16             }
17             CGPROGRAM
18             #pragma vertex vert
19             #pragma fragment frag
20             #pragma target 3.0
21             #include "UnityCG.cginc"
22             #include "Lighting.cginc"
23             fixed4 _BasicColor;
24             float _SpecularPow;
25             fixed _SpecularChoice;
26             fixed _DiffuseChoice;
27             fixed4 _SpecularColor;
28             struct a2v{
29                 float4 position :position;
30                 float3 normal :normal;
31             };
32             struct v2f{
33                 float4 sv_position :sv_position;
34                 float3 texcoord :texcoord0;
35                 float3 wc_position :texcoord1;
36             };
37             v2f vert(a2v a){
38                 v2f v;
39                 v.sv_position=UnityObjectToClipPos(a.position);
40                 v.texcoord=UnityObjectToWorldNormal(a.normal);
41                 v.wc_position=mul(unity_ObjectToWorld,a.position).xyz;
42                 return v;
43             }
44             float4 frag(v2f v) :SV_Target{
45                 fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;
46                 fixed3 lDir=normalize(_WorldSpaceLightPos0.xyz);
47                 fixed3 nDir=normalize(v.texcoord);
48                 fixed3 rDir=normalize(reflect(-lDir,nDir));
49                 fixed3 vDir=normalize(_WorldSpaceCameraPos.xyz-v.wc_position);
50                 fixed3 hDir=normalize(lDir+vDir);
51                 fixed Lambert=dot(nDir,lDir);
52                 fixed HalfLambert=0.5+0.5*Lambert;
53                 fixed3 diffuse=_BasicColor.rgb*saturate(Lambert*(1.0-_DiffuseChoice)+HalfLambert*_DiffuseChoice);
54                 fixed3 Phone=saturate(dot(rDir,vDir));
55                 fixed3 Blinn=saturate(dot(nDir,hDir));
56                 fixed3 Specular=_SpecularColor.rgb*pow((Phone*(1.0-_SpecularChoice)+Blinn*_SpecularChoice),_SpecularPow);
57                 return fixed4(ambient+_LightColor0.rgb*(diffuse+Specular),1.0);
58             }
59             ENDCG
60         }
61     }
62 }

实现环境光+漫反射+高光反射的标准光照模型

实现兰伯特,半兰伯特、Phone,Blinn-Phone之间线性变化的逐像素方法Shader

学习资料:Unity Shader 入门精要+庄懂的技术美术入门课

 

标签:normalize,1.0,Shader,fixed3,Unity,position,fixed,光照
From: https://www.cnblogs.com/vusblog/p/17144373.html

相关文章

  • Unity手机移动设备重力感应
    一、引入大家对重力感应应该都不陌生,之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念,根据手机的晃动来给实体进行晃动。下图的王者荣耀刚开始的界面其实就是使用......
  • 虚拟机VMware安装Fedora15/ubuntu 11,要想使用gnome3/unity 要怎么办呢?
    SelecttheAccelerate3DgraphicsAcceleratedgraphicscapabilitiesapplytoWindowsXP,WindowsVista,andWindows7guests,onhostsrunningWindowsorLinux......
  • Unity2D游戏开发Update与FixedUpdate间的区别
    Update方法是每一帧执行一次,FixeUpdate方法是每0.02秒执行一次,即我们常说的50帧的刷新率,我们在进行物理模拟动作的编写中,常常会写在FixeUpdate中,由于是每0.02秒执行一次,不......
  • Unity客户端框架收集
    转载:https://blog.csdn.net/t163361/article/details/106499225LoxodonFrameworkhttps://github.com/cocowolf/loxodon-frameworkMVVM框架;支持XLua,可以完全使用Lua脚本......
  • 局部光照
    前言​ 本篇将介绍局部光照模型——每个物体的光照独立于其他物体,即仅考虑光源直接发出的光线,忽略场景中反弹的为何我们可以看见这个五彩缤纷的世界?​ 光源是由红蓝绿三......
  • Unity3D----行为操作
    Unity3D----行为操作1.导入资源          2.将小人模型放置到摄像机下           3.设置移动3.1创建 AnimatorContro......
  • 【Unity AR】复刻<PokemonGo - AR精灵>部分学习记录
    一、实验摘要   《宝可梦GO》(pokemonGo)是一款能对现实世界中出现的宝可梦进行探索捕捉、战斗以及交换的游戏。玩家可以通过智能手机在现实世界里发现宝可梦,进行抓捕和......
  • Unity Coroutine和async、await对比
    此篇文章,不谈原理,只聊用法,对比着看更容易理解  上述代码执行的逻辑顺序是一样的定义异步方法,协程用IEnumerator,线程用 async具体异步执行的内容,协程用yield,线程......
  • 修改物体材质的shader以及修改shader内对应 比如颜色 修改
          例如这个shader 他里面就两个参数他这个maincolor 对应的修改内容是_Color  ......
  • Qt Quick 3D - 实现车道线 - 3(shader控制远近端虚化效果)
    QtQuick3D-实现车道线-3(远近端虚化效果)1.俩种方式  1.1一种是在顶点着色器里面通过计算远近端的顶点,并根据pos数值,进行除法计算,得到一个比例,再与color数值相......