[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.mzph.cn/news/164413.shtml

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

相关文章

报错For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

.报错For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 报错信息如下&#xff1a; ./aten/…

力扣labuladong——一刷day46

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣971. 翻转二叉树以匹配先序遍历二、力扣987. 二叉树的垂序遍历三、力扣666. 路径总和 IV 前言 二叉树的递归分为「遍历」和「分解问题」两种思维模式&a…

面试:RocketMQ相关问题

文章目录 什么是 RocketMQ&#xff0c;有哪些使用场景&#xff1f;RocketMQ 由哪些⻆色组成&#xff0c;每个⻆色作用和特点是什么&#xff1f;RocketMQ 中的 Topic 和 JMS 的 queue 有什么区别&#xff1f;RocketMQ 消费模式有几种&#xff1f;RocketMQ 的 Consumer 是如何消费…

【深度学习】Python快捷调用InsightFace人脸检测,纯ONNX推理

pypi资料&#xff1a; https://pypi.org/project/insightface/ 模型选择&#xff1a; https://github.com/deepinsight/insightface/tree/master/python-package#model-zoo onnxruntime的GPU对应CUDA &#xff1a; https://onnxruntime.ai/docs/reference/compatibility …

1999-2021年地级市城镇居民人均消费性支出数据

1999-2021年地级市城镇居民人均消费性支出数据 1、时间&#xff1a;1999-2021年 2、指标&#xff1a;城镇居民人均消费性支出 3、范围&#xff1a;290个地级市 4、来源&#xff1a;城市年鉴、地级市统计公报 5、指标解释&#xff1a; 城镇居民人均消费性支出&#xff1a;指…

kubesphere安装依赖文件

yum install socat -y yum install conntrack -y

GAMES101-Homework2

目录 普通作业&#xff1a;提高作业&#xff1a;参考博客博客一博客二博客三 附代码框架的个人一些注释和理解&#xff1a;rasterizer.cppTriangle.cpp 普通作业&#xff1a; // 判断点是否在三角形内的辅助函数 static bool insideTriangle(float x, float y, const Vector3f…

再添千万级罚单,某银行年内罚款过亿!金融行业合规问题亟待解决

11月17日晚间&#xff0c;国家金融监管总局上海监管局披露行政处罚信息显示&#xff0c;某银行因32项违法违规事实收到两张690万元的大额罚单&#xff0c;合计罚款金额达1380万元。但这并不是银行该今年收到的第一张大额罚单。今年4月28日&#xff0c;该行因在结售汇、外币理财…

k8s-pod生命周期 4

容器环境初始化 pod 由pod 镜像来提供&#xff0c;在pod 生命周期里容器主要分为两种&#xff1a;初始化容器和主容器 初始化容器一定要成功运行并退出&#xff0c;当初始化容器运行退出完了之后主容器开始和运行 主容器开始运行的时候&#xff0c;有两个探针&#xff1a;存…

什么是arguments对象?

arguments 对象是 JavaScript 中的一个特殊对象&#xff0c;它包含了函数被调用时传入的所有参数。arguments 对象是一个类数组对象&#xff0c;它有一个 length 属性和按数字索引的元素。 每个函数在执行时都会自动创建一个 arguments 对象。我们可以通过arguments去访问参数…

网络图简单计算规则

单代号进度网络图&#xff08;节点法&#xff09; 概念 计算规则 &#xff08;顺时针计算法&#xff09; &#xff08;TF取之差&#xff09; &#xff08;T&#xff1a;持续时间&#xff09; ES → EF (ES取大EF加T) ↑ T ↑ &#xff08;TF&#xff1a;总时差&…

NOIP2003提高组第二轮T3:加分二叉树

题目链接 [NOIP2003 提高组] 加分二叉树 题目描述 设一个 n n n 个节点的二叉树 tree \text{tree} tree 的中序遍历为 ( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n) (1,2,3,…,n)&#xff0c;其中数字 1 , 2 , 3 , … , n 1,2,3,\ldots,n 1,2,3,…,n 为节点编号。每个节点都…

【视觉SLAM十四讲学习笔记】第三讲——Eigen库

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 本章将介绍视觉SLAM的基本问题之一&#xff1a;如何描述刚体在三维空间中的运动&#xff1f; Eigen…

网工内推 | Base北京,国企网工运维,最高30k*14薪,IE认证优先

01 万方数据股份有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责完成基础网络组网工作&#xff1b; 2.负责网络对象的访问控制及安全策略&#xff0c;配置VLan&#xff0c;黑白名单、地址转换、故障排查及网络安全监控工作&#xff1b; 3.负责对操作系…

Vue框架学习笔记——Vue实例中el和data的两种写法

文章目录 前文提要Vue实例的el第一种写法第二种写法小结 Vue实例中data第一种写法&#xff0c;对象式效果图片第二种写法&#xff0c;函数式效果图片小结 前文提要 本文仅做自己的学习记录&#xff0c;如有错误&#xff0c;请多谅解 Vue实例的el 第一种写法 <body><…

Python图片文件和base64编码互转

图片和base64编码互转 import base64 import cv2# 将图片base64字符串生成图片文件. def base64_to_img(base64_code,save_img_path):"""根据base64生成图片.:param base64_code: 图片的base64文件:param save_img_path: 生成的图片路径:returns: None"&q…

分布式锁之基于mysql实现分布式锁(四)

不管是jvm锁还是mysql锁&#xff0c;为了保证线程的并发安全&#xff0c;都提供了悲观独占排他锁。所以独占排他也是分布式锁的基本要求。 可以利用唯一键索引不能重复插入的特点实现。设计表如下&#xff1a; CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

(二)C语言之变量与算数运算表达式概述

C语言之变量与算数运算表达式概述 一、华氏温度与摄氏温度对照二、代码概述三、练习 一、华氏温度与摄氏温度对照 #include <stdio.h>/*当华氏温度为 0,20,40,...300时&#xff0c;打印出华氏温度与摄氏温度对照表华氏温度与摄氏温度 C(5/9)(̧F-32) 其中C表示摄氏温度&…

顺序栈和链栈

#include<iostream> using namespace std; #define MAXSIZE 100 typedef int SElemType; typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack;//顺序栈 //构造一个空栈 int InitStack(SqStack& s) { s.base new SElemType…

Django之中间件与CSRF_TOKEN

文章目录 一、什么是中间件二、中间件有什么用三、Django自定义中间件中间件中主要方法及作用创建自定义中间件的步骤&#xff1a;process_request与process_response方法process_view方法process_exceptionprocess_template_response&#xff08;不常用&#xff09; 四、CSRF_…