[shader] 光照入门(未完结。。。

反射

漫反射:而当物体表面粗糙时,我们把物体表面看作无数不同方向的微小镜面,则这些镜面反射出的光方向均不相同,这就是漫反射。

高光反射:我们假定物体表面光滑,只有一个镜面,那么所有的光都被反射向了同一个方向(其实只是用时最短的光相位相似),这就是高光反射。

逐顶点光照和逐片元光照

逐顶点光照

1.在顶点上进行光照计算,顶点间的内部区域使用插值来获取颜色信息。

2.计算量小,适用于移动设备及性能要求较高的场景。

3.效果不够精细,细节损失。明暗变化损失严重。

逐片元光照

1.每个像素单独进行光照计算。

2.精细度高,效果真实。

3.计算量大,耗费资源,适用于PC或主机游戏。

颜色相乘与颜色相加

颜色相加(复合光):计算光照反射时使用,向白色靠拢。

颜色相乘:计算颜色混合时使用,趋于黑色。

兰伯特光照模型

1.理论:漫反射的强度仅与入射光的方向反射点处表面法线的夹角余弦成正比

2.公式:光源颜色*材质的漫反射颜色*max(0,标准化物体表面法线向量·标准化后光源方向向量)

实现思路

逐顶点光照

1.材质漫反射颜色属性声明

2.渲染标签Tags设置,将LightMode光照模式设置为向前渲染

3.引用内置文件UnityCG.cginc和Lighting.cginc

4.结构体声明(裁剪空间下的顶点坐标、对应顶点的漫反射光照颜色)

5.基于公式实现逻辑(为了阴暗面不为全黑,需要加上兰伯特环境光颜色)

Shader "Unlit/Lambert" {
    Properties {
        // 材质漫反射颜色属性声明
        _MainColor ("MainColor", Color) = (1, 1, 1, 1)
    }
    SubShader {
        // 设置渲染标签 将LightMode光照模式设置为ForwardBase 向前渲染
        Tags { "LightMode" = "ForwardBase" }

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            //材质的漫反射颜色
            fixed4 _MainColor;

            //顶点着色器传递给片元着色器的内容
            struct v2f
            {
                //裁剪空间下的顶点坐标
                float4 pos:SV_POSITION;
                //对应顶点的漫反射光照颜色
                fixed3 color:COLOR;
            };

            //逐顶点光照 反射光照颜色计算写在顶点着色器的回调函数中
            v2f vert(appdata_base v) {
                v2f v2fData;
                // 模型空间 ——> 裁剪空间的顶点 
                v2fData.pos = UnityObjectToClipPos(v.vertex);

                //模型空间下的法线 ——> 世界空间的法线
                float3 normal = UnityObjectToWorldNormal(v.normal);
                //世界空间下的 光源单位向量
                fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);

                fixed3 color = _LightColor0.rgb * _MainColor.rgb * max(0, dot(normal, lightDir));

                //记录颜色 加上兰伯特光照模型的环境光变量
                v2fData.color = UNITY_LIGHTMODEL_AMBIENT.rgb + color;
                return v2fData;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                //传出兰伯特光照
                return fixed4(i.color.rgb, 1);
            }
            ENDCG
        }
    }
}

逐顶点和逐片元光照区别

1.在顶点着色器种计算顶点和法线

2.在片元着色器中计算兰伯特光照

Shader "Unlit/LambertF" {
    Properties {
        _MainColor ("MainColor", Color) = (1, 1, 1, 1)
    }
    SubShader {
        
        Tags { "LightMode" = "ForwardBase" }

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"
            #include "UnityCG.cginc"
            //材质漫反射颜色
            fixed4 _MainColor;

            //顶点着色器返回出去的内容
            struct v2f {
                //裁剪空间的 顶点坐标
                float4 pos : SV_POSITION;
                //世界空间的 法线位置
                float3 normal : NORMAL;
            };

            v2f vert(appdata_base v) {
                v2f v2fData;
                //模型空间——>裁剪空间 顶点
                v2fData.pos = UnityObjectToClipPos(v.vertex);
                //模型空间——>世界空间 法线
                v2fData.normal = UnityObjectToWorldNormal(v.normal);

                return v2fData;
            }

            //片元着色器
            fixed4 frag(v2f i) : SV_TARGET {
                //得到光源单位向量
                float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
                //光源颜色*材质的漫反射颜色*max(0,标准化物体表面法线向量·标准化后光源方向向量
                fixed3 color = _LightColor0.rgb * _MainColor * max(0, dot(i.normal, lightDir));
                color = UNITY_LIGHTMODEL_AMBIENT.rgb + color;

                return fixed4(color.rgb, 1);
            }
            ENDCG
        }
    }
}

半兰伯特光照模型

1.使物体背面拥有明暗变化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/182328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序前端环境搭建

搭建微信小程序前端环境 申请小程序测试账号 访问路径 使用微信扫描二维码进行申请,申请成功之后,进入界面,获取小程序ID(AppID)和秘钥(AppSecret) 安装微信web开发者工具 访问路径 选择稳定开发的版本 需要在小程序的设置中将默认关闭…

深入理解JVM 类加载机制

深入理解JVM 类加载机制 虚拟机如何加载Class文件? Class文件中的信息进入到虚拟机后会发生什么变化? 类加载机制就是Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机…

AMEYA360:瑞萨面向高端工业传感器系统推出高精度模拟前端的32位RX MCU

全球半导体解决方案供应商瑞萨电子(TSE:6723)宣布面向高端工业传感器系统推出一款全新RX产品——RX23E-B,扩展32位微控制器(MCU)产品线。新产品作为广受欢迎的RX产品家族的一员,具有高精度模拟前…

3D火山图绘制教程

一边学习,一边总结,一边分享! 本期教程内容 **注:**本教程详细内容 Volcano3D绘制3D火山图 一、前言 火山图是做差异分析中最常用到的图形,在前面的推文中,我们也推出了好几期火山图的绘制教程&#xff0…

如何通过宝塔面板搭建一个本地MySQL数据库服务并实现远程访问

宝塔安装MySQL数据库,并内网穿透实现公网远程访问 文章目录 宝塔安装MySQL数据库,并内网穿透实现公网远程访问前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网…

Axios 通过a标签下载文件 跨域下载

<!-- a标签占位 --><a ref"down" ></a>getTest() {this.$axios.request({url: https://cnv13.55.la/download?file_key3695fa9461a0ae59cf3148581e4fe339&handle_typeexcel2pdf,method: get,responseType: blob, // 切记类型 blob}).then(re…

java:CommandLineRunner命令行操作

背景 CommandLineRunner是一个SpringBoot提供的接口&#xff0c;这个接口可以让我们在SpringBoot启动之后&#xff0c;执行一些特定的命令行操作。 实现CommandLineRunner接口后&#xff0c;SpringBoot在启动的时候会自动执行run方法。通常&#xff0c;我们可以在run方法中进…

TableStructureRec: 表格结构识别推理库来了

目录 引言lineless_table_rec: 无线表格识别库安装使用结果 wired_table_rec&#xff1a;有线表格识别库安装使用结果 写在最后 引言 TableStructureRec 仓库是用来对文档中表格做结构化识别的推理库&#xff0c;包括来自 PaddleOCR 的表格结构识别算法模型、来自阿里读光有线…

Python监控服务进程及自启动服务方法与实践

1. 需求概述 当我们在Windows Server环境中部署XX系统的实际应用中&#xff0c;往往会遇到一些运维管理的挑战。为了确保系统的持续稳定运行&#xff0c;特别是在服务程序因各种原因突然关闭的情况下&#xff0c;我们可以借助Python的强大生态系统来构建一个监控与自动重启的管…

Linux下载工具XDM下载安装与使用

Windows上IDM多线程下载非常强大&#xff0c;即能捕捉页面上的视频、图片、音频&#xff0c;又能作为浏览器下载器使用&#xff0c;但是IDM无法在Linux下使用&#xff0c;除非使用wine。不过我们可以在Linux中用XDM(Xtreme Download Manager)代替IDM。 1、XDM下载 Xtreme Dow…

线性回归中的函数求导

在线性回归中&#xff0c;函数求导是一个重要的数学工具&#xff0c;用于计算损失函数关于模型参数的导数。通过求导&#xff0c;我们可以找到最优的参数值&#xff0c;以实现更好的线性回归拟合。 本文将介绍线性回归的基本原理&#xff0c;以及如何通过函数求导来优化线性回…

C++设计模式之工厂模式(下)——抽象工厂模式

抽象工厂模式 介绍示例示例使用运行结果抽象工厂模式的优缺点优点缺点 总结 介绍 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种封装一组相关或相互依赖对象的方式&#xff0c;而无需指定它们具体的类。它允许客户端使用抽象接口来创建一系列相关的对象&#xff…

Java常用类

目录 包装类 装箱和拆箱 包装类型和String的转换&#xff0c;包装类的常用方法 包装类 装箱和拆箱 package com.edu.wrapper;public class Interger01 {//演示int<-->Integer的装箱和拆箱//手动装箱int n1100;Integer integer new Integer(n1);Integer integer01 In…

UML建模图文详解教程01——Enterprise Architect的安装与使用

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Enterprise Architect概述 官方网站&#xff1a;https://www.sparxsystems.cn/products/ea/&#xff1b;图示如下&#xff1a; Enterprise Architect是一个全功能的、基于…

【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)

文章目录 1. 前缀表达式(波兰表达式)1.1. 前缀表达式的计算机求值 2. 中缀表达式3. 后缀表达式(逆波兰表达式)3.1. 后缀表达式的计算机求值3.2. 逆波兰计算器的实现 4. 中缀表达式 转 后缀表达式4.1. 思路分析4.2. 代码实现 5. 逆波兰计算器的完整版 1. 前缀表达式(波兰表达式)…

Django(十、中间件)

文章目录 一、中间件的介绍中间件有什么用中间件功能自定义中间中间件的顺序 一、中间件的介绍 中间件顾名思义&#xff0c;是介于request与response处理之间的一道处理过程&#xff0c;相对比较轻量级&#xff0c;并且在全局上改变django的输入与输出。因为改变的是全局&…

【精选】​​深度学习:构建卷积神经网络的表情识别系统(源码&教程)

1.研究背景与意义 随着社交媒体和在线通信的普及&#xff0c;人们越来越多地使用表情符号来表达情感和情绪。表情识别系统的发展成为一个重要的研究领域&#xff0c;旨在通过计算机自动识别和理解人类的表情&#xff0c;从而提高人机交互的效果和用户体验。 传统的表情识别方…

Java之《ATM自动取款机》(面向对象)

《JAVA编程基础》项目说明 一、项目名称&#xff1a; 基于JAVA控制台版本银行自动取款机 项目要求&#xff1a; 实现银行自动取款机的以下基本操作功能&#xff1a;读卡、取款、查询。&#xff08;自动取款机中转账、修改密码不作要求&#xff09; 具体要求&#xff1a; 读卡…

github批量仓库克隆,git clone某个用户的所有仓库

利用github的api工具&#xff0c; 首先拿到用户名为kevin的所有仓库的url&#xff1a; curl "https://api.github.com/users/kevin/repos?per_page100&&page1" | grep -w clone_url >clone.txt过滤一下&#xff1a; grep -o https://[^"]* clone…

Vue学习笔记-Object.defineproperty函数

文章目录 前文提要Object.defineProperty作用Object.defineProperty参数使用例图getter&#xff0c;也就是get函数setter&#xff0c;也就是set函数 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 Object.defineProperty作用 当在js中声明了一个变…
最新文章