自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(131)
  • 收藏
  • 关注

原创 【UnityShader入门精要学习笔记】第十一章 Shader动画

动画效果的实现往往是通过把时间添加到一些变量的计算中,以便在时间变化时画面也随之变化。UnityShader中提供了一系列关于时间的内置变量来允许我们方便地在Unity中访问运行时间

2024-04-25 20:03:35 1045 2

原创 【UnityShader入门精要学习笔记】第十章 高级纹理(2)渲染纹理

摄像机的渲染结果会输出到颜色缓冲中,并显示到我们的屏幕上。现代的GPU允许我们把整个三维场景渲染到一个中间缓冲中,即**渲染目标纹理(Render Target Texture ,RRT)** , 而不是传统的帧缓冲或者后备缓冲(back buffer,就是我们之前讲到的进行画面切换时,颜色缓冲重新渲染时需要使用的缓冲区)。与之相关的是**多重渲染目标(Multiple Render Target ,MRT)** 。这种技术指的是GPU允许我们把场景同时渲染到多个渲染目标纹理中(例如4种渲染效果,正常情况

2024-04-18 21:21:51 1124

原创 【UnityShader入门精要学习笔记】第十章 高级纹理(1)立方体纹理

和之前的纹理不同,立方体纹理(这里指的是为物体材质应用的纹理)包含了6张图像,这些图像对应了立方体的六个面,即摄像机处于立方体的中心点,并沿着三条轴的六个方向观察所得到的图像。之前的2D纹理我们通过UV坐标进行采样,但是立方体纹理是一个三维纹理,因此我们若对其进行采样就需要使用一个三维的纹理坐标。这个三维纹理坐标即为世界空间下的一个三维向量(即为上图暗红色箭头表示),我们沿着这个向量向外延伸,那么就会与立方体中的其中一个纹理相交,而采样结果就是由该交点计算而来的。

2024-04-12 11:57:05 690

原创 【UnityShader入门精要学习笔记】第九章 更复杂的光照(3)——光照阴影

在现实中的阴影是如何产生的?由于光是直射的,因此当一道光线遇到一个不透明的物体,那么这个物体就会投射阴影,阴影部分区域是光无法到达的区域。在实时渲染中,最常使用的是一种叫做Shadow Map的技术,这种技术理解起来很简单——就是把摄像机位置放置与光源重合的位置上,那么摄像机看不到的地方即为阴影区域了。在前向渲染路径中,如果场景中最重要的平行光开启了阴影,Unity就会为该光源计算它的**阴影映射纹理(Shadow Map)** 。这张阴影映射纹理本质上也是一张深度图。它记录了从该光源的位置触发、能

2024-04-08 20:10:54 1114 1

原创 【UnityShader入门精要学习笔记】第九章 更复杂的光照(2)——光源类型和前向光照渲染

由于每种光源的几何定义都不同,因此对应的光源属性也就不同。不过Unity为我们提供了很多的内置函数来处理这些光源。一般而言,光源最常用的属性有:光源的位置、方向、颜色、强度以及衰减这五个属性,这些个属性和他们的几何定义息息相关

2024-03-30 19:44:27 1147

原创 【UnityShader入门精要学习笔记】第九章 更复杂的光照(1)——渲染路径

在之前的章节中,我们学习了关于基础光照计算的Shader,之前的场景中往往只有一个光源且光源类型是平行光。但在实际开发过程中,我们往往需要处理更多数目、类型更复杂的光源。本章将会学习实现更复杂的光照,并且还可以得到阴影。在学习这些之前,我们有必要知道Unity是如何处理这些光源的。当我们在场景里放置了各种类型的光源后,Unity的底层渲染引擎是如何让我们在Shader中访问它们的?

2024-03-29 15:58:24 1085

原创 【UnityShader入门精要学习笔记】第八章 透明效果

想要在实时渲染中实现透明效果,我们通常需要在渲染模型时控制它的**透明通道(Alpha Channel)** 。当开启透明混合之后,物体在渲染时除了颜色值和深度值之外,还有另一个属性——透明度。当透明度为1的时候,表示该像素是完全不透明的,而当其为0代表完全透明。

2024-03-26 20:53:39 642

原创 【UnityShader入门精要学习笔记】第七章 基础纹理

本章中我们学习了不同纹理贴图的作用以及如何用于计算。使用材质贴图进行表面光照颜色值相乘,使用法线贴图实现凹凸映射,使用渐变纹理实现光照处与阴影处的颜色值过渡,使用遮罩纹理实现遮罩计算。本章涉及Shader较多,但光照计算万变不离其宗。只需记住两种模板:切线空间法线计算以及世界空间法线计算即可。

2024-03-20 11:43:13 1075 1

原创 【UnityShader入门精要学习笔记】第六章(2)在Unity中实现光照模型

本章中我们学习了光照模型的原理以及如何在Unity Shader中实现光照模型。以标准光照模型为例,光照模型的计算包含了环境光,自发光,高光反射,漫反射四个部分。其中环境光,自发光都是全局变量,我们需要关注的是实现漫反射和高光反射的光照模型。光照渲染有逐顶点渲染和逐像素渲染两种方式,前者计算主体在顶点着色器上, 后者计算主体在片元着色器上。从上述代码中,我们熟悉了一个光照渲染的过程:1.获取并转换模型的顶点信息,摄像机信息,光源信息等等,以计算公式中的各种向量。

2024-02-28 17:53:18 1052 1

原创 【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

在上文中我们了解了,光照我们通常用辐照度来描述其强度,并可以用光源方向l和法线向量n的夹角余弦值cosθcos\thetacosθ来描述光的辐照度。在光线发射过程中会发生吸收和散射两种现象。为了模拟光照,我们通常用光照模型对光线进行计算着色。在标准光照模型中,通常存在四类光线:自发光——材质自身的发光值,环境光——反射光照的间接光照,通常用全局变量来表示,漫反射——与辐照度类似,反射光线的强度与表面法线和光源方向之间的夹角的余弦值成正比;

2024-02-26 21:06:17 1131

原创 【UnityShader入门精要学习笔记】第五章(2)优化你的Shader

本章给出了一些写出规范Shader代码的建议,整洁的代码是提升效率所必须的。

2024-02-20 11:32:21 932

原创 【UnityShader入门精要学习笔记】第五章(1)年轻人的第一个Shader

在前文代码中,我们看到了例如等大写的名称。这些是CG/HLSL提供的语义(semantics)。语义实际上就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义,让Shader知道从哪读取数据,并把数据输出到哪里。这些语义在CG/HLSL的流水线中是不可或缺的,他们描述了变量的用途。至于变量本身存储了什么,Shader并不关心。Unity为了方便对模型数据的传输,对一些语义进行了特别的含义规定,例如,在顶点着色器的输入结构体a2v中用TEXCOORD0。

2024-01-25 19:53:46 1056

原创 【UnityShader入门精要学习笔记】第四章(6)法线变换、内置变量以及本章答疑

在模型中,我们的切线空间一般而言是根据模型的UV方向来决定的,UV方向确定xy轴,一般U方向代表切线T,V方向代表副切线B,法线N就是正交的z轴方向(沿着面片的正面为正方向)。当然,由于法线是顶点的信息之一,法线是可以自定义方向的,这也会导致切线方向随之改变。由于切线与UV坐标相关,因此我们对其可以直接应用3阶线性变换$M_{A\to B}$,将切线从原坐标空间A变换到新坐标空间B:

2024-01-15 23:56:49 1068

原创 【UnityShader入门精要学习笔记】第四章(5)坐标空间

上述空间转换过程被我们称为一个MVP变换,M代表model,V代表view,P代表projection投影。顶点着色器最基本的任务就是将顶点从模型空间转换到裁剪空间,也就是需要在顶点着色器中实现MVP变换。

2024-01-12 22:21:56 1036

原创 【UnityShader入门精要学习笔记】第四章(4)矩阵的几何意义

变换(transform)(突然一惊,transform不是UnityObject的基本属性之一吗?),指的是我们将一些数据,如点、方向向量甚至是颜色等,通过某种方式进行转换的过程。什么是线性变换(Linear transform)fxfyfxykfxfkxfxfyfxykfxfkxx→fx→yx→fx→y,向量x经过变换fxf(x)fx变为向量y。

2024-01-11 15:36:02 1094

原创 【UnityShader入门精要学习笔记】第四章(3)矩阵的性质

如果你想学习计算机图形学的相关知识,我默认诸位读者已经了解线性代数的基本知识。也正因如此我才在开篇就极力推荐大家先去观看[线性代数的本质]一课。

2024-01-10 16:57:03 1117

原创 【UnityShader入门精要学习笔记】第四章(2)点和向量

点(point)是n维空间中的一个位置,它没有大小,宽度这些概念。一个空间是由无数的点构成的,我们可以用任意点的坐标描述物体在该空间中的位置。在二维,三维笛卡尔坐标系中,我们用实数来表示点的坐标,例如向量(vector,或者矢量,但我建议还是叫做向量)。几何定义上讲,向量是n维空间中包含了模长(magnitude)和方向(direction)的有向线段。向量与标量(scalar)

2024-01-09 19:57:20 982 1

原创 【UnityShader入门精要学习笔记】第四章(1)坐标系

计算机图形学是建立在虚拟世界上的数学模型,因此数学也渗透到了图形学的方方面面。在学习Shader的过程中,我们最常用的就是矢量和矩阵(计算机的重要基础之一——线性代数)。(这里建议大家提前预习,观看3blue1brown的线性代数的本质一课,会有很大收获,强烈建议大家在学习第四章前先去看看该系列视频,一定对你理解线性代数有很大帮助,坐标系较为简单,因此本章大部分内容被浓缩了 )学习数学可以便于我们在学习研究他人编写的Shader时理解其中的原理所在。

2024-01-08 20:51:30 992

原创 【UnityShader入门精要学习笔记】第三章(3)章节总结

上一节我们学习了Unity Shader的定义、使用方法和基本结构。让我们回忆一下。我们在学习渲染流水线的时候了解到,Shader是用于着色器编程的。我们首先要区分,Unity中的Shader和我们在渲染流水线中的Shader不是同一个东西,Unity中的Shader统称为Unity Shader。如果开发者需要配置渲染流水线,就需要进行诸多配置以及着色器代码编写,其中涉及的配置和文件实在太多。Unity为这些工作集成了一个方便的抽象层,也就是。

2024-01-06 11:45:38 1022

原创 【UnityShader入门精要学习笔记】第三章(2)Unity Shader的形式,章节答疑

上一节我们学习了Unity Shader的定义、使用方法和基本结构。让我们回忆一下。我们在学习渲染流水线的时候了解到,Shader是用于着色器编程的。我们首先要区分,Unity中的Shader和我们在渲染流水线中的Shader不是同一个东西,Unity中的Shader统称为Unity Shader。如果开发者需要配置渲染流水线,就需要进行诸多配置以及着色器代码编写,其中涉及的配置和文件实在太多。Unity为这些工作集成了一个方便的抽象层,也就是。

2024-01-05 21:38:14 1100

原创 【UnityShader入门精要学习笔记】第三章(1)Unity Shader介绍

根据第二章中我们学习的知识,我们知道了渲染管线中有各种可编程的着色器阶段和许多可以配置的渲染设置。其实UnityShader的作用就是对各类着色器代码以及渲染设置进行管理。材质(Material)Shader一个常见的网格体渲染设置的流程是:创建一个材质创建一个UnityShader,并把它赋给上一步中创建的材质(或是选择Unity预设的Shader)把材质赋给要渲染的对象在材质面板中调整UnityShader的属性,以得到满意的效果。

2024-01-04 21:37:02 1018

原创 【UnityShader入门精要学习笔记】第二章(3)章节答疑

上节笔记中,我们学习了GPU的渲染流水线。总结一下我们前两章所学习的全部知识。首先,我们学习了渲染的基本流程,其实渲染的本质是将纹理,材质,网格等数据先从硬盘加载到RAM中,再从RAM加载到VRAM由GPU进行计算得到屏幕画面。往往是由3D场景出发渲染成2D的屏幕画面,整个渲染是GPU和CPU共同作用的结果。最终,当光栅化阶段也完成了,渲染结果会被绘制到屏幕上,我们的屏幕显示的是颜色缓冲区的颜色值,为了避免屏幕看到正在光栅化的图元。GPU采取了双重缓冲的策略 ,屏幕显示的是前置缓冲,而光栅化是在后置缓冲。

2024-01-03 17:58:48 1124 1

原创 【UnityShader入门精要学习笔记】第二章(2)GPU流水线

虽然上述流程描述了很多(其实曲面细分着色器和几何着色器都没讲),但实际过程要更加复杂。当然上述内容与其他资料会产生差异,这是由于图像编程接口的实现不尽相同,而GPU在底层也做了很多优化。基本原理都是融会贯通的,未来可在学习Games101或者RTR4时重拾。在Unity中为我们封装了很多功能,更多时候我们只需要在一个Unity Shader设置一些输入,编写顶点着色器和片元着色器,设置一些状态就能达到大部分常见的屏幕效果。(更别说现在Unity提供了URP和SRP等渲染管线)

2024-01-02 17:00:49 1051

原创 【UnityShader入门精要学习笔记】第二章(1)了解渲染流水线

什么是流水线?书中举了一个生产洋娃娃的例子。1. 制作躯干2. 缝上眼睛和嘴巴3. 添加头发4. 最终包装洋娃娃的制作经过了四道工序,如果每道工序耗时一小时。而一个工人想要生产一个洋娃娃则需要四个小时。资本家们想到了一个好方法,让每个专人负责一道工序,这样四个人四道工序,所有步骤就可以同时并行。假设工序1完成了洋娃娃A的躯干制作任务,那么他不需要等待洋娃娃A被最终包装就能直接进行下一个洋娃娃B的躯干制作任务了。熟悉编程的小伙伴可能更了解它的另一个名字,就是PipeLine。

2024-01-01 20:01:43 1094

原创 【Unity学习笔记】光照简介

本节主要是简单介绍一些常见的光照组件和渲染设置。

2023-12-12 11:09:27 382

原创 【ARFoundation学习笔记】2D图像检测跟踪

在ARFoundation中,图像跟踪系统依据参考图像库中的图像信息尝试在周围环境中检测到匹配的2D图像并跟踪。

2023-11-21 13:55:30 478 1

原创 【ARFoundation学习笔记】点云与参考点

点云是特征点的集合,特征点是指AR Foundation通过VIO检测捕获的摄像头图像中的视觉差异点,这些视觉差异点是从图像中明暗、颜色、灰度差异比较大的点中挑选出来的,AR Foundation会实时更新这些特征点。

2023-11-10 20:06:00 488

原创 【C#学习笔记】事件

事件(event)有能力使一个类或者对象在发生相关事情的时候去通知其他类,对象们。简单来说一个事件在发生后会去通知所有的监听事件的成员函数,让它们进行对应的事件处理。乍一看事件和多播委托很像,实际上事件也是委托的一种特殊的封装。所以我们也可以定义一个泛型委托,例如不止顾客点单,服务员自己也可以给自己点咖啡,在不继承同一个基类的情况下就可以用泛型委托来接受不同类型对象的事件响应。

2023-11-08 15:41:14 255

原创 【ARFoundation学习笔记】射线检测

射线检测是Unity中常见的一种物理检测方法,具体就不赘述了。除了Unity提供的Physics.Raycast()方法进行射线检测外,AR foundation还提供了AR RaycastManager组件专门用于AR中处理射线与平面、特征点的碰撞检测。

2023-11-07 10:40:08 201

原创 【ARFoundation学习笔记】平面检测

写在前面的话本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请。

2023-11-06 20:20:39 790

原创 【ARFoundation学习笔记】ARFoundation基础(下)

写在前面的话本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请。

2023-11-06 19:03:56 260

原创 【ARFoundation学习笔记】ARFoundation基础(上)

写在前面的话本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请。本文从原文第二章开始。

2023-11-05 19:28:01 521 1

原创 【Unity学习笔记】DOTween(2)官方案例

本文中大部分内容学习来自此处无法展示动图(懒得录GIF),请下载自行学习。

2023-08-24 19:37:06 1353 1

原创 【Unity学习笔记】DOTween(1)基础介绍

DOTween是一个动画插件,Tween是补间的意思。这个插件以下简称DOT,DOT很方便使用,只需要记住四个类,三个方法:四个类TweenerSequenceTween三个方法DOSetOn。

2023-08-24 16:35:37 878

原创 【C#学习笔记】数据类中常用委托及接口——以List<T>为例

List为什么是神?在谈论这个问题之前,我想先说说其他数据表结构相较于List究竟差在了哪里……首先是HashTable本身呢就被完爆,HashTable既不是线程安全的,也不是类型安全的,虽然提供了Synchronized()方法可以获取线程安全的类型,以为自己是个哈希表就可以为所欲为了,但这种挑战神的行为导致最终降下了神罚,最后几乎被HasSet所取代。HashSet的Contains方法复杂度是O(1),List的Contains方法复杂度是O(n)。HashSet。

2023-08-23 17:18:12 1804

原创 【C#学习笔记】匿名函数和lambda表达式

匿名函数声明需要配合委托使用,并且声明时需要在函数头加上delegate,匿名函数的无参构造可以省略括号。匿名函数定义不允许使用泛型(很好理解,泛型是为了函数调用时能够灵活地接受不同类型的参数,但是使用匿名函数意味着它只会被调用一次,与其使用泛型不如让我们直接指定)定义带参数的匿名函数只需像正常函数定义即可。如果需要返回值只需使用Funcreturn q;lambda表达式就是匿名函数的一种创建方式,使用lambda表达式可以省略匿名函数的delegate。

2023-08-22 15:30:38 1435

原创 【C#学习笔记】委托和事件

在 .NET 中委托提供后期绑定机制。 后期绑定意味着调用方在你所创建的算法中至少提供一个方法来实现算法的一部分。说的更简单一点,我们可以通过调用委托实现一大串方法的处理。委托像是一个装函数的容器,在我之前的文章里,将其比作了服务员点菜时写的小单子,当触发委托的时候,就是将单子交给后厨,厨师就会按顺序做出我们点的菜。

2023-08-21 18:25:26 350

原创 【C#学习笔记】C#特性的继承,封装,多态

照理继承封装多态应该是学习笔记中最先学习的。但是本系列不是面向新手的,基础的继承封装多态的概念应当是要被掌握的。而本文需要讲述C#中的一些继承封装多态的特性。部分摘自。

2023-08-19 15:00:17 442

原创 【C#学习笔记】数组和索引器

使用索引器,用于访问类中的元素(一般是数组元素,通常通过index访问,但是也可以用于其他需要使用序号的情况,例如使用序号来访问int型中的第n个数字,当然也能访问枚举类型。并且接口中定义了get和set权限,则在继承类中必须实现索引器的get和set。在下例中,使用索引值来访问索引,下面设置的索引器是只读的,实现了通过索引值来访问索引号的方法。并不是定义的多维数组,而是交错数组,也就是数组中的数组。交错数组被称为数组中的数组,其内部往往定义了多个数组。继承了该接口,并在接口中定义了索引器的读写访问器。

2023-08-05 18:05:34 1088

原创 【C#学习笔记】类型转换

或关键字分别用于定义隐式转换或显式转换。定义转换的类型必须是该转换的源类型或目标类型。可用两种类型中的任何一种类型来定义两种用户定义类型之间的转换。digit } ";使用自定义类型可以定义隐式转换和显示转换,但是要注意类型匹配。

2023-08-05 15:53:28 730

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除