因为第一章内容太少,就再更一章吧~
第二篇 渲染流水线
Q:渲染流水线在干什么?
A:渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机、一些光源、一些Shader以及纹理等。
使用流水线的好处在于可以提高单位时间的生产量。
流水线系统中决定最后生产速度的是最慢的工序所需的时间(短板效应)
理想情况下,如果把一个非流水线系统分成n个流水线阶段,且每个阶段耗费时间相同的话,会使整个系统得到n倍的速度提升。(多线渲染?)
渲染流程(概念上的流水线)
渲染流程分成3个阶段:应用阶段(Application Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)。
应用阶段
这个阶段是由我们的应用主导的,因此通常由CPU负责实现。主要包含三个任务:
12graph LR准备场景数据 --> 粗粒度剔除culling--> 渲染图元and输出渲染所需几何信息
几何阶段
几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们, ...
致自己
之前我学习过一段时间的Shader入门精要(大概是学到第六章吧),但后面的章节都没有学习,加上时间久远很多内容都忘记了,故打算重新学一遍。
为了勉励自己坚持下去,也为了记录一些学习过程,此系列就出现啦!
❤️ ❤️
(希望自己能够坚持学完,在渲染方面有所收获,可以制作出满意的效果)
📑 此系列每周一更
第一篇 欢迎来到Shader的世界
语录
程序员的三大浪漫是编译原理、操作系统和图形学(是的,我已经听到很多人在反驳这句话了,不要当真啦)
我们是程序员中的“外貌协会”,期待着用代码编写出一个绚丽多姿的世界。这就是我们的浪漫。
我们之所以要学习Shader,是想要学习如何把物体按照自己的意愿渲染到屏幕上,但是,Shader只是整个渲染流程中的一个子部分。
和C++这样的高级语言不同,尽管Shader的编写语言已经达到了我们可以理解的程度,但Shader更多地是面向GPU的工作方式,所以它的一些语法对我们来说并不那么直观。
基础篇大纲1-4章
第2章 渲染流水线 这一章讲解了现代GPU是如何实现整个渲染流水线的,这些内容对于理解Shader的工作原理有 ...
除去三大功能外,NodeCanvas还有一些别的有趣的东西,能帮助我们改进3大流程。
Standalone Action List
给对线添加如上脚本后,我们可以在对象上进行一些可视化的对话构建。
自定义Action和Condition
我们可以自定义自己的节点,方便我们在3大功能上使用。
生成脚本如下:
生成的行为123456789101112131415161718192021222324252627282930313233343536373839using NodeCanvas.Framework;using ParadoxNotion.Design;namespace NodeCanvas.Tasks.Actions{ [Category("my")] [Description("输出一些内容")] public class Mylog : ActionTask{ //Use for initialization. This is called only once in the lif ...
主要功能
基础功能都有,具备良好的扩展性。
播放对话
对话音效
分支对话
概览对话
条件对话
…
快速食用
添加脚本
添加角色并给角色添加
编写对话树
启动对话树
默认是不启动对话树的,可以在代码中控制启动也可以在属性面板设置游戏开始时启动。
12345678public DialogueTreeController dialogueTreeController;private void Update(){ if (Input.GetKeyDown(KeyCode.X)) { dialogueTreeController.StartBehaviour(); }}
为了保证对话正确显示,在UI层需要添加官方的预制体和事件系统监听
存在的问题待学习
❓NodeCanvas的对话树似乎 在显示富文本内容时存在问题。例如使用颜色代码,会出现输出颜色代码之后再实现效果的问题
❓ 其配置的UI显示界面不清楚是如何进行绑定的
FSM有限状态机是一种设计方式,用于处理不同状态的切换
其主要包含以下几个部分:
状态(进入、更新、离开)
过渡条件 【用于控制状态的切换】
状态机控制器【用于控制状态机】
本文主要介绍NodeCanvas的FSM使用,具体基础FSM概念不做解释。
FSM示例图
开始
为游戏对象添加如下脚本:
结点类型
NodeCanvas中结点分为几个类型:
Action State(动作状态,只处理进入状态)
Super Action State (超级动作状态,能处理进入、更新、离开状态)
Pass(过渡态,不做任何处理)
Parallel(并行。 在状态机处于任意状态时,并行执行)
Any State(能够从任意状态进行状态切换,在状态机过程中,时刻监听)
结语
在FSM中,也没什么太多可以讲的,其条件和行为结点为NodeCanvas行为树、状态机、对话树所共用。
个人感觉,NodeCanvas设计最棒的一点就是,他三种系统用的同一个底层,而且可以互相嵌套兼容。
认识行为树
什么是行为树?
自顶向下的树形结构
行为树Behavior Tree 是一种数据结构,自顶向下的树形结构。
什么情况下要使用行为树?
情况多变,条件复杂
在处理逻辑复杂的问题时,这个复杂可能是条件复杂,情况多样。
行为树并非是游戏Ai的专属,在处理其他复杂业务逻辑或可能时都可以尝试用行为树来解决。
行为树有什么优点?
高效可读,易于扩展
行为树解决的问题是将复杂的关系,简单化,能很大程度的加强程序的可读性,健壮性。
行为树由哪几部分组成?
主要由四部分 CDAC 组成 ,两根两叶
1234Composites 组合节点 只能作为根节点,控制子节点的执行(顺序)Decorator 装饰节点 只能作为根节点,修饰子节点Actions 行为节点 只能作为叶子节点,执行具体动作Conditinals 条件节点 只能作为叶子节点,判断条件
行为树的工作流程?
自顶向下,从左至右(并发进行),逐层进行
行为树执行的成果(成功/失败),由其子节点决定,子节点执行完成后会向父节点传递成功/失败的消息,
...
本文采用:unity2021.1.5f1c1 HDRP渲染管线
开始
创建HDRP项目,并设置好相关配置。
搭建的场景如图所示:
🔸认识VFX Graph
创建一个VFX Graph可以点击Edit进入编辑界面,其编辑界面和ShaderGraph类似。
🔹 编写Graph
孵化器循环
针对于持续性和非持续性进行区分
初始化粒子
完成上述2个步骤时,效果如下,记得替换粒子的贴图
渲染粒子
通过渲染器设置,火花效果更好了
更新粒子-使用重力
现在我们的火花是直线发射的,我们想让其受到一个重力自动下垂。
在更新粒子模块,增加重力,设置一个随机数重力。
添加重力后,可以看到我们的粒子受重力而下垂。
❤️完善火花
发射形状
Local和World坐标
在布局坐标中,粒子效果不会残留,为了让我们的火花可以在世界中残留,需该为世界坐标系
添加碰撞
我们希望火花粒子能够和周围环境产生碰撞
碰撞框
添加如下碰撞框组件:
其中:LifeTime Loss为生命损失
发现我们的粒子在接触碰撞框时会被弹开。
碰撞事件
为了响应碰撞添加如下组件
...
体验一下ASE插件
体验
创建一个ASE Suface shader,依图连接节点。
效果如下:
感受
整体感受ASE插件,在某些方面确实强于ShaderGraph ,例如可以直接在默认渲染管线中使用。
总之,用起来挺爽的。😄
本系列基于Unity2021.1.5f1c1
安装HDRP
在管理器安装hdrp后会自动弹出此初始化对话框。
根据对话框检测的步骤,将需要修正的地方进行修正。
修正后全部呈现绿√。
修正完成,系统自动添加了如下包。
添加天空盒子
在Volume组件中添加如下组件,可以设置天空盒。
调节光线亮度
在Volume组件中添加如下组件,可以设置调节光线。










