【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

实现简单的半兰伯特光照模型

在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面。
使用半兰伯特光照可以解决这个问题。

逐顶点光照技术也被称为兰伯特光照模型。因为它符合兰伯特定律。
Valve公司在开发半条命的时候提出了半兰伯特光照模型。

【Unity Shader学习笔记】Unity光照基础-半兰伯特光照
半兰伯特光照模型没有使用max操作来防止n和I的点积为负值,而是对其结果进行了一个α 倍的缩放再加上一个β 大小的偏移。
绝大多数情况下,α 和β的值均为0.5,即公式为:
【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

对于模型的背光面,在漫反射模型中点积结果将映射到同一个值,即0值处;而在半兰伯特模型中,背光面也可以由明暗变化,不同的点积结果会映射到不同的值上。

需要注意的是,半兰伯特是没有任何物理依据的,它仅仅是一个视觉加强技术。
半兰伯特光照与逐像素漫反射光照的代码很相近,只需要把计算部分稍作修改即可。
代码如下:

Shader "Unity Shaders Book/Chapter 6/HalfLambert" {
    Properties{
        _Diffuse("Diffuse", Color) = (1, 1, 1, 1)
    }

        SubShader{
            Pass {
                Tags {"LightMode" = "ForwardBase"}
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "Lighting.cginc"
                fixed4 _Diffuse;
                struct a2v {
                    float4 vertex : POSITION;
                    float3 normal : NORMAL;
                };

                struct v2f {
                    float4 pos : SV_POSITION;
                    float3 worldNormal : TEXCOORD0;
                };

                //逐顶点漫反射光照
                v2f vert(a2v v) {
                    v2f o;
                    //Transfrom the vertex from object space to projection space
                    o.pos = UnityObjectToClipPos(v.vertex);
                    //Transform thhe normal from object space to world space
                    o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);

                    return o;
                }

                fixed4 frag(v2f i) : SV_Target {
                    //get ambient term
                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;

                //get the normal in world space
                fixed3 worldNormal = normalize(i.worldNormal);

                //get the light direction in world space
                fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);

                //Compute diffuse term(计算漫反射项)
                fixed halfLambert = dot(worldNormal, worldLightDir) * 0.5 + 0.5;
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLambert;

                fixed3 color = ambient + diffuse;

                return fixed4(color, 1.0);
            }

            ENDCG
        }
    }
    Fallback "Diffuse"
}

效果如下:

【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

Original: https://www.cnblogs.com/Wu-765279087/p/16172789.html
Author: IDEA_W
Title: 【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588401/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • dpdk在虚拟机上出错处理

    本文介绍的步骤基本适用于dpdk 1.7.0 – dpdk 2.0.0 各版本。只是setup.sh显示的菜单有一些小的不同;同样的,也适用于ubuntu更高版本(已在…

    Java 2023年5月30日
    066
  • 正交编码器

    增量式编码器 增量式编码器也称为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲就对应于一个增量位移,编码器眉庄东固定的位移就会产生一个脉冲信号,通过读取单位时间…

    Java 2023年6月5日
    089
  • 【MySQL】order by引起的慢查询问题总结

    最近遇到了一个SQL没有走索引导致出现慢查询的问题,SQL本身很简单,两张表联合查询然后进行排序和分页,由于涉及到一些业务,这里以用户表和订单表为例,用户表数据在35W左右,订单表…

    Java 2023年6月8日
    083
  • security学习笔记

    spring security 入门案例 创建springboot工程 引入依赖 org.springframework.boot spring-boot-starter-secu…

    Java 2023年6月9日
    070
  • A JSONObject text must begin with ‘{‘ at 1 [character 2 line 1],将ListString转json(存入redis),json转回ListString

    今天在写项目时,从redis存取数据时报了json格式与List的转换异常: 下面总结一下将ListString转json存入redis,以及从redis取出json转回ListS…

    Java 2023年6月5日
    049
  • Spring Boot入门一:在Eclipse中使用Spring boot

    1.安装插件 打开Eclipse-Help-Eclipse Marketplace-搜索spring tools,找到对应工具安装 下载完成后,重启eclipse,选择新建proj…

    Java 2023年5月30日
    071
  • SpringBoot自动装配

    1、SpringBoot自动装配是什么? 关键文件: META-INF/spring.factories 启动器:spring-boot-starter-XXX 文件中的配置的类型…

    Java 2023年6月5日
    0103
  • 躬行算法之最小的最大值

    最近看到这样一道面试题, 求最小的最大值,觉得挺有意思,在这里分享下。 给定一个数组 a,包含 n 个整数。再给定一个整数 k,可以给数据中任意整数加 1,总共可以加 k 次。加完…

    Java 2023年6月8日
    074
  • Java使用HTTPS登录网站代码实现

    步骤一,获得网站的登录URL,及Form页元数据 这点可以通过Chrome的F12按键,检查登录时发送的数据包获得(【Preserve Log】建议打勾)。以登录京东网站为例,示范…

    Java 2023年5月29日
    0167
  • [转] nginx关于root与alias的区别

    配置demo: <span class="hljs-keyword">location <span class="hljs-titl…

    Java 2023年5月30日
    081
  • java stream 多字段排序

    我觉得最实用的当属这种原形: var comparator= Comparator.comparing((SocietyMember x)->x.getSocietyId()…

    Java 2023年5月29日
    0107
  • Semaphore实战

    Semaphore信号量计数器。和CountDownLatch,CyclicBarrier类似,是多线程协作的工具类,相对于join,wait,notify方法使用起来简单高效。下…

    Java 2023年6月8日
    052
  • Abp RabbitMqEventBus

    RabbitMQ安装介绍查看该网址 两个App都要配置 appsettings.json { "RabbitMQ": { "Connections&q…

    Java 2023年5月29日
    077
  • 做了这些年开发,今天第一次梳理了这三种常用的变量

    在前边分享自定义springboot的配置文件的时候,提到了JVM变量和系统环境变量的配置,今天想对这块的内容做个梳理, 1、什么是JVM变量、系统环境变量、程序变量; 2、怎么使…

    Java 2023年6月9日
    065
  • 用了这跨操作系统远控软件,我再也不出差了

    远程调试的困境 对于IOT终端产品开发来说,调试有很多问题,无法复现产品的问题、无法查看出问题当时的log、需要指导用户进行tar包升级,无法查看远程设备状态。有的时候需要一边调试…

    Java 2023年6月15日
    089
  • Nginx 四层负载均衡

    Nginx 四层负载均衡 四层负载均衡:TCP/IP网络层,主要处理对工作在网络层建立网络链接的服务提供负载均衡应用。 Nginx:Nginx-1.9.0后续版本新增四层负载均衡功…

    Java 2023年5月30日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球