自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Unity学习笔记】ECS开发框架和帧同步

近期看了守望先锋团队关于在2017GDC发布的守望先锋的ECS开发框架和帧同步的演讲,对ECS实现的帧同步架构十分着迷。因此打算着手实现一个ECS下的帧同步的游戏Demo。。在学习了几天源码之后稍微对ECS有了一定的理解。不过这个项目的架构不是很完善,有些地方看的还是很迷糊,特别是在Unity的游戏场景开发上十分不理解(其实现方式中,每个GameObjcet的实例化都是通过加载预制体,然后在服务端进行物理计算,导致客户端和服务端同一个功能模块的代码不尽相同,看的很迷糊)。

2024-07-17 16:21:57 1170

原创 【Unity学习笔记】A*寻路算法

而不是类似Dijkstra算法,每次遍历相邻结点时尽管下一个结点可能出现权值过大的情况,但是我们不能确保它不是全局最优的,因此我们依然要把它加入到遍历路径中。贪心算法适用于路径带有不同权值的时候,遍历时我们优先遍历相邻结点中权值较小者,这样做的好处是如果找到了路径,那么我们的路径一定是部分最短的(相邻结点永远是最短的,虽然不一定是全局最短,但是相对来说不会是最差的)依次类推,按照表格上的路径,在第二轮发现v4达到不了v3,因此我们放弃这条路径,再次回到第二轮,选择除了这条路径以外最短的,也就是。

2024-07-04 21:06:46 1339

原创 【Unity设计模式】✨使用 MVC 和 MVP 编程模式

MVC架构是本系列的重中之重,MVC框架相信大部分程序员(尤其做前后端的)都不会陌生。MVC的全称是Model-View-Controller(模型-视图-控制器),由于Controller才是中间部分,也许MCV更适合它?MVC 背后的一般思想是将软件的逻辑部分与数据和UI(显示窗口)分开。这有助于减少不必要的依赖关系。Model存储数据:模型严格来说是一个保存值的数据容器。它不执行游戏逻辑或运行计算。View是界面:视图在屏幕上格式化和呈现数据的图形表示。

2024-06-30 17:10:33 1384

原创 【Unity小技巧】记一个RenderTexture无法正确输出Camera视图下的Depth渲染的问题

这个问题出现在使用URP管线时,我试图用Shader实现血条的制作,并用RenderTexture将视图渲染到RawImage上。但是渲染结果出现了问题:可以看到液体边缘的渲染出现了错误,原因不明似乎是摄像机渲染到RenderTexture时Shader的透明度测试的问题?

2024-06-25 22:46:32 335

原创 【Unity设计模式】使用对象池

对象池技术是老生常谈的一个概念了,很简单,无论是软件开发还是编程语言的学习中,我们都经常接触到池化技术。池化技术指的是将一些常用的变量或对象存储到一个公共池中,当我们需要调用这些变量或对象的时候,直接引用公共池中的对象而无需new一个新对象。例如管理socket的连接池,管理string的Intern字符串池,还有管理GameObject的对象池等等等等。在Unity中,如果你想要实现发射子弹的功能,那么就需要在发射时实例化子弹预制件。但是如果使用创建和销毁Destory()

2024-06-24 11:26:45 991

原创 【Unity设计模式】状态编程模式

最近在学习Unity游戏设计模式,看到两本比较适合入门的书,一本是unity官方的,另一本是这两本书介绍了大部分会使用到的设计模式,因此很值得学习本专栏暂时先记录一些教程部分,深入阅读后续再更新。

2024-06-20 21:10:58 1244

原创 【Unity设计模式】观察者模式,发布订阅模式,事件总线

最近在学习Unity游戏设计模式,看到两本比较适合入门的书,一本是unity官方的,另一本是这两本书介绍了大部分会使用到的设计模式,因此很值得学习本专栏暂时先记录一些教程部分,深入阅读后续再更新。

2024-06-18 20:51:01 1372

原创 【Unity学习笔记】反射

在我平时做项目的时候,由于我们做的项目都是很简单的,所以不怎么接触反射机制。最早了解反射机制是关于Invoke的时候,知道可以通过方法名来直接进行Invoke调用,但是由于反射调用存在性能开销较大的问题,因此就没打算深入了解、不过反射作为C#的高级特性,可以不用,但是不能不了解反射(Reflection) 的含义和用法。

2024-06-06 15:13:04 1221

原创 【C#学习笔记】属性和字段

最近在工作的过程中常常会觉得自己在程序设计方面的能力还是有欠缺。例如一直对于变量的声明感到不足,在工作中为了图方便总是直接public定义字段,实际上造成了很多困扰,特写此文总结一下应当怎样定义成员变量。

2024-06-05 16:29:47 1282

原创 【UnityShader入门精要学习笔记】第十七章 表面着色器

表面着色器实际上就是对顶点片元着色器上的一层抽象,使用表面着色器可以用一种更容易理解的方式编写shader,不需要考虑前向渲染路径还是延迟渲染路径,场景中的光源等等等等要素。

2024-06-04 20:35:35 1425

原创 【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (下)

另一个造成GPU的性能瓶颈的原因是需要处理过多的片元。除了我们之前说的减少模型网格顶点数减少片元外,这部分的重点更在于减少OverDraw——即同一个像素的重复绘制。

2024-05-31 19:52:00 1215

原创 【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (上)

对于CPU来说,限制他的主要是每一帧中DrawCall的数目。我们曾介绍过DrawCall的相关概念和原理,简单来说,就是CPU在每次通知GPU进行渲染之前,都需要提前准备好顶点数据(如位置、法线、颜色、坐标纹理等),然后调用一系列API把他们放到GPU可以访问到的指定位置。

2024-05-31 16:45:03 995

原创 【UnityShader入门精要学习笔记】第十五章 使用噪声

在有些时候,向规则的事物里面添加一些杂乱无章的效果,往往会有奇效。而这些杂乱无章的效果的来源就是噪声。在本章中我们将学习如何使用噪声来模拟一些特效。

2024-05-29 15:34:06 416

原创 【UnityShader入门精要学习笔记】第十四章 非真实感渲染

要实现卡通风格的渲染,其中之一就是使用基于色调的着色技术,在7.3部分我们使用渐变纹理实现了这样的效果。卡通的高光效果也和我们之前学习的光照不同,在卡通风格中,模型的高光往往是一块块分界明显的纯色区域。

2024-05-23 14:30:40 969

原创 【UnityShader入门精要学习笔记】第十三章 使用深度和法线纹理

有的时候我们不仅希望得到当前屏幕的颜色信息,还希望得到深度和法线信息,例如上一章节中用到的边缘检测和运动模糊功能,都可以通过深度和法线纹理来解决。由于深度和法线的图像不受纹理和光照的影响,仅仅保留了渲染物体的模型信息,因此相比于一些图像算法要更加可靠。

2024-05-17 15:13:21 788

原创 【UnityShader入门精要学习笔记】第十二章 屏幕后处理效果

简单的来说,使用卷积我们可用以某个像素为中心的周围像素进行权值计算,并讲处理后的值重新赋值给中心像素。其中这个由权值构成的矩阵被称为卷积核(kenel)。通过卷积操作,我们可以对图像进行一系列的处理,如图像模糊,边缘检测,颜色均值等等操作。

2024-05-14 20:23:57 1257 1

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

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

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

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

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

2024-04-18 21:21:51 1368

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

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

2024-04-12 11:57:05 771

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

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

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

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

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

2024-03-30 19:44:27 1228

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

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

2024-03-29 15:58:24 1205

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

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

2024-03-26 20:53:39 845

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

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

2024-03-20 11:43:13 1278 2

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

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

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

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

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

2024-02-26 21:06:17 1177

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

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

2024-02-20 11:32:21 1023

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

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

2024-01-25 19:53:46 1105

原创 【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 1190

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

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

2024-01-12 22:21:56 1078

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

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

2024-01-11 15:36:02 1156

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

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

2024-01-10 16:57:03 1153

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

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

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

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

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

2024-01-08 20:51:30 1061

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

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

2024-01-06 11:45:38 1044

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

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

2024-01-05 21:38:14 1198

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

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

2024-01-04 21:37:02 1125

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

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

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

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

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

2024-01-02 17:00:49 1130

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

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

2024-01-01 20:01:43 1192

空空如也

空空如也

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

TA关注的人

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