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

news2024/9/24 18:38:35

反射

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

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

逐顶点光照和逐片元光照

逐顶点光照

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.coloradmin.cn/o/1243665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件工程师从0到1】- 多态 (知识汇总)

前言 介绍:大家好啊,我是hitzaki辰。 社区:(完全免费、欢迎加入)日常打卡、学习交流、资源共享的知识星球。 自媒体:我会在b站/抖音更新视频讲解 或 一些纯技术外的分享,账号同名:hi…

使用XHProf查找PHP性能瓶颈

使用XHProf查找PHP性能瓶颈 XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。 下载 网上很多是编译安装xhprof-0.9.4版本,应该是用php5,在php8.0下编译x…

【spring(三)】AOP总结

🌈键盘敲烂,年薪30万🌈 目录 一、AOP相关概念 ① AOP核心思想思想: ② AOP专业术语: 二、AOP快速如入门 三、AOP工作流程 四、切入点表达式 ① 语法格式 ②支持通配符 ③书写技巧 五、通知类型 ①⭐环绕通知…

pip安装tkinter模块失败 No matching distribution found for tkinter

我想使用Python创建一个简单的桌面应用程序, 这个应用程序依赖于tkinter, 然而,当我尝试安装过程时,出现了错误。 $ pip install tkinter ERROR: Could not find a version that satisfies the requirement tkinter (from versions: none) ERROR: No matching distributio…

java--权限修饰符

1.什么是权限修饰符 就是是用来限制类中的成员(成员变量、成员方法、构造器、代码块...)能够被访问的范围。 2.权限修饰符有几种&#xff1f;各自的作用是什么&#xff1f; private<缺省<protected<public(范围由小到大)

【华为数通HCIP | 网络工程师】821-IGP高频题、易错题之OSPF(2)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

经典的回溯算法题leetcode组合问题整理及思路代码详解

目录 组合问题 leetcode77题.组合 leetcode216题.组合总和III leetcode40题.组合总和II leetcode39题.组合总和 倘若各位不太清楚回溯算法可以去看我上一篇文章。 回溯算法详解-CSDN博客 组合问题 一般组合和排列类的问题我们都会转化成一个树形问题&#xff0c;更便于…

C++程序中dump文件生成方法详解

最近项目中新作成了一个动态链接库&#xff0c;长时间运行后&#xff0c;偶尔会崩溃。根据log分析&#xff0c;被调用的动态库函数最外层catch到了这个异常&#xff0c;但是不能定位哪里出了问题。另外虽然上层exe是有dump文件输出处理的&#xff0c;但是在C中&#xff0c;如果…

专用设备上的SD卡插入电脑想读取数据,提示要格式化?

环境&#xff1a; Win10 专业版 车载感应数据专用SD卡 问题描述&#xff1a; 专用设备上的SD&#xff0c;现在把SD卡从设备取出&#xff0c;用读卡器插入电脑提示要格式化&#xff1f; 解决方案&#xff1a; 1.先进入PE查看SD分区情况&#xff0c;SD格式为ext4 查看文件…

爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;不服输的你&#xff0c;他们拿什么赢 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请点赞…

计算机组成原理2

1.浮点数 2.IEEE 754 3.存储器的性能指标 4.存储器的层次化结构 主存类似手机运行内存8g &#xff0c;辅存类似手机内存128g.... 辅存必须先通过主存才能被cpu接收&#xff0c;就例如微信打开那个月亮小人界面两三秒就是主存在读取辅存的程序然后被cpu接收运行。 5.主存储…

EMG肌肉电信号处理合集(三)

本文主要展示常见的肌电信号预处理的实现&#xff0c;开发环境为matlab。 目录 1 肌电信号低通&#xff0c;高通&#xff0c;带通滤波 2 去除DC 0阶偏置&#xff0c;1阶偏置 3 全波整流 4 信号降采样 5 linear envolope / butterworth 低通滤波器 1 肌电信号低通&#xf…

(一)C语言之入门:使用Visual Studio Community 2022运行hello world

使用Visual Studio Community 2022运行c语言的hello world 一、下载安装Visual Studio Community 2022 与 新建项目二、编写c helloworld三、编译、链接、运行 c helloworld1. 问题记录&#xff1a;无法打开源文件"stdio.h"2. 问题记录&#xff1a;调试和执行按钮是灰…

【LeetCode】挑战100天 Day13(热题+面试经典150题)

【LeetCode】挑战100天 Day13&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-152.1 题目2.2 题解 三、面试经典 150 题-153.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

Node使用Nvm安装双版本切换(node两个版本同时用怎么办?不同的项目Node版本要求不一样怎么办?)

先把node.js卸载 开始—>添加删除程序—>node npm -v node -v //检查是否还存在&#xff0c;卸载成功就行了NVM下载 github下载 百度网盘下载 打开安装包以管理员身份安装&#xff0c;要是记得这个路径并且必须全是英文 使用nvm安装两个使用的node版本 cmd以管理员…

手撕A*算法(详解A*算法)

A*算法原理 全局路径规划算法&#xff0c;根据给定的起点和终点在全局地图上进行总体路径规划。 导航中使用A*算法计算出机器人到目标位置的最优路线&#xff0c;一般作为规划的参考路线 // 定义地图上的点 struct Point {int x,y; // 栅格行列Point(int x, int y):x(x),y(y){…

【C++】拷贝构造函数,析构函数详解!

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

国家超级计算济南中心低代码平台应用实践

摘要&#xff1a;文章主要介绍了济南超算使用低代码平台明道云解决了一系列业务问题&#xff0c;包括资产管理、人员与机构管理、流程制度管理等。通过明道云平台&#xff0c;济南超算成功地将不同部门的业务信息进行整合&#xff0c;提高了工作效率和管理水平。文章还强调了明…

外部网关协议_边界网关协议BGP

一.边界网关协议BGP的基本概念 边界网关协议(Border Gateway Protocol&#xff0c;BGP&#xff09;属于外部网关协议EGP这个类别&#xff0c;用于自治系统AS之间的路由选择协议。由于在不同AS内度量路由的“代价”(距离、带宽、费用等&#xff09;可能不同&#xff0c;因此对于…