最常使用到的就是矢量和矩阵(数学的分支之一——线性代数)
笛卡尔坐标系
大部分的计算位置、距离和角度等变量都是在笛卡尔坐标系下进行的。
二维笛卡尔坐标系
一个特殊的位置,原点,它是整个坐标系的中心
两条过原点相互垂直的矢量,x轴和y轴。
不同的渲染方式,坐标系不同
三维笛卡尔坐标系
三个坐标轴相互垂直,长度为1,这样的基矢量被称为标准正交基
这三个坐标轴被称为是基矢量
左手坐标系和右手坐标系
在二维笛卡尔坐标系中,我们可以通过旋转将任何的坐标系重合,也就是说所有的二维笛卡尔坐标系都是等价的。
但对于三维坐标系,有时不能靠这种旋转来使2个不同朝向的坐标系重合。
左手坐标系
右手坐标系
Unity的坐标系
在模型空间和世界空间中,使用左手坐标系
观察空间,使用右手坐标系,z轴坐标的减少意味着场景深度的增加
练习
右手坐标系
点和矢量矩阵矩阵变换坐标空间法线变换
第三章 UnityShader基础
正式进入shader学习了,好耶!
使用UnityShader的流程:
创建一个材质
创建一个UnityShader,为材质添加
把材质赋给对象
调整shader属性
创建ShaderUnity包含了多种shader模板供我们使用。
Standard Surface Shader
标准光照模型
Unlit Shader
不包含光照(但包含雾效)
mage Effect Shader
实现各种屏幕后处理效果
Unity Shader的导入面板还可以方便地查看其使用的渲染队列(Render queue)、是否关闭批处理(Disablebatching)、属性列表(Properties)等信息。
ShaderLabShaderLab是Unity为我们抽象的一种shader语言,可以更方便的通用。
基本结构123456789101112131415Shader "ShaderName"{ Properties{ //属性 Name("dis ...
写在前面单例模式在Unity中是一种非常常用的方式,和传统单例不同,在Unity中针对不同的情况可分为以下几种方式:heart: 。
普通单例
适用于普通的Mono类。
123456789101112131415161718192021222324namespace singleton{ /// <summary> /// 单例 /// </summary> /// <typeparam name="T"></typeparam> public abstract class Singleton<T> where T : new() { private static T _instance; public static T Instance { get { if (_instance!=null) ...
在之前Unity想要实现延迟执行或者是等待,要么只能使用自己计数的方法,要么使用协程。
Ep.1 协程首先让我们来看一个协程示例:
示例是循环10次,每次等待0.2s。
协程示例1234567891011IEnumerator Func(){ for (int i = 0; i < 10; i++) { print(i); yield return new WaitForSeconds(0.2f); }}//启动协程StartCoroutine(Func());
Ep.2 Async 异步
Async异步的概念是微软基于多线程提出的Task解决方案,相比传统多线程具有很多优势。
:heart:相比协程来说,异步的方式不需要搭建基础的协程框架(不需要新创建一个方法),可以直接在方法中使用关键字实现等待。
不需要启动
Async示例12345678async void AsyncFunc(){ for (int i = 0; i < 10; i++) ...
因为第一章内容太少,就再更一章吧~
第二篇 渲染流水线Q:渲染流水线在干什么?
A:渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机、一些光源、一些Shader以及纹理等。
使用流水线的好处在于可以提高单位时间的生产量。
流水线系统中决定最后生产速度的是最慢的工序所需的时间(短板效应)
理想情况下,如果把一个非流水线系统分成n个流水线阶段,且每个阶段耗费时间相同的话,会使整个系统得到n倍的速度提升。(多线渲染?)
渲染流程(概念上的流水线)
渲染流程分成3个阶段:应用阶段(Application Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)。
应用阶段这个阶段是由我们的应用主导的,因此通常由CPU负责实现。主要包含三个任务:
12graph LR准备场景数据 --> 粗粒度剔除culling--> 渲染图元and输出渲染所需几何信息
几何阶段几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们,在 ...
致自己
之前我学习过一段时间的Shader入门精要(大概是学到第六章吧),但后面的章节都没有学习,加上时间久远很多内容都忘记了,故打算重新学一遍。
为了勉励自己坚持下去,也为了记录一些学习过程,此系列就出现啦!
:heart: :heart:
(希望自己能够坚持学完,在渲染方面有所收获,可以制作出满意的效果)
:bookmark_tabs: 此系列每周一更
第一篇 欢迎来到Shader的世界语录
程序员的三大浪漫是编译原理、操作系统和图形学(是的,我已经听到很多人在反驳这句话了,不要当真啦)
我们是程序员中的“外貌协会”,期待着用代码编写出一个绚丽多姿的世界。这就是我们的浪漫。
我们之所以要学习Shader,是想要学习如何把物体按照自己的意愿渲染到屏幕上,但是,Shader只是整个渲染流程中的一个子部分。
和C++这样的高级语言不同,尽管Shader的编写语言已经达到了我们可以理解的程度,但Shader更多地是面向GPU的工作方式,所以它的一些语法对我们来说并不那么直观。
基础篇大纲1-4章
第2章 渲染流水线 这一章讲解了现代GPU是如何实现整个渲染流水线的,这些内容对 ...
除去三大功能外,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 lifet ...
主要功能
基础功能都有,具备良好的扩展性。
播放对话
对话音效
分支对话
概览对话
条件对话
……
快速食用添加脚本
添加角色并给角色添加
编写对话树
启动对话树
默认是不启动对话树的,可以在代码中控制启动也可以在属性面板设置游戏开始时启动。
12345678public DialogueTreeController dialogueTreeController;private void Update(){ if (Input.GetKeyDown(KeyCode.X)) { dialogueTreeController.StartBehaviour(); }}
为了保证对话正确显示,在UI层需要添加官方的预制体和事件系统监听
存在的问题待学习
:question:NodeCanvas的对话树似乎 在显示富文本内容时存在问题。例如使用颜色代码,会出现输出颜色代码之后再实现效果的问题
:question: 其配置的UI显示界面不清楚是如何进行绑定的
FSM有限状态机是一种设计方式,用于处理不同状态的切换
其主要包含以下几个部分:
状态(进入、更新、离开)
过渡条件 【用于控制状态的切换】
状态机控制器【用于控制状态机】
本文主要介绍NodeCanvas的FSM使用,具体基础FSM概念不做解释。
FSM示例图
开始为游戏对象添加如下脚本:
结点类型NodeCanvas中结点分为几个类型:
Action State(动作状态,只处理进入状态)
Super Action State (超级动作状态,能处理进入、更新、离开状态)
Pass(过渡态,不做任何处理)
Parallel(并行。 在状态机处于任意状态时,并行执行)
Any State(能够从任意状态进行状态切换,在状态机过程中,时刻监听)
结语在FSM中,也没什么太多可以讲的,其条件和行为结点为NodeCanvas行为树、状态机、对话树所共用。
个人感觉,NodeCanvas设计最棒的一点就是,他三种系统用的同一个底层,而且可以互相嵌套兼容。








