Unity学习笔记(4) UnityShader学习笔记_3:标准光照模型的底层原理

本文详细介绍了Unity Shader中的光照模型,包括环境光、自发光、漫反射和高光反射等概念,并通过具体代码实例展示了逐顶点光照和逐片元光照的实现方法,最后讲解了如何使用Unity内置函数优化光照计算。

笔记都是照着“Unity Shader入门精要”摘抄的,为以后想要复习实现方便。

标准光照模型

20220116140531
20220116140650
上面是考虑光照时抽象出的背景情况,光照模型Lighting Model就是用于根据材质属性光源信息等得出在某个观察方向出射度的过程。也就是着色(Shading)过程。

标准光照模型使用自发光环境光高光反射漫反射来叠加计算出摄像头看到的物体的光(颜色)

环境光和自发光

环境光是一个全局变量,在Unity中设置,
在Shader中可以通过UNITY_LIGHTMODEL_AMBIENT获取。
自发光暂时不考虑:
考虑直接自发光很简单,直接在片元着色器最后的颜色输出中添加即可,
考虑间接自发光较难,因为需要计算其它物体对自发光物体光源的反射。

漫反射光照

基本光照模型中,漫反射光照的计算公式:
20220116212835

入射光线的颜色和强度:clightc_{light}clight
材质的漫反射系数:mdiffusem_{diffuse}mdiffuse
表面法线:n^\hat{n}n^
光源方向:III

逐顶点光照
Shader "Custom/DiffuseVertex"
{
   
   
    Properties{
   
   
        _Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
    }
    SubShader{
   
   
        Pass{
   
   
            Tags{
   
   "LightMode" = "ForwardBase"}//定义了正确的LightMode,才能得到Unity内置的光照变量
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc" //使用内置库文件
            fixed4 _Diffuse; //得到材质的漫反射属性,需要使用Properties中声明的属性,要定义一个类型相通的同名变量
            //顶点、片元着色器的输入输出结构体
            struct a2v{
   
   
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };
            struct v2f{
   
   
                float4 pos : SV_POSITION;
                fixed3 color : COLOR;
            };

            v2f vert(a2v v){
   
   
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取环境光
                fixed3 worldNormal = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值