自定义特性可以用来标记一些类或类成员
123456789101112131415161718192021222324252627282930313233343536373839404142using System;using UnityEngine;namespace Test{ [Author("Fasty")] public class Test: MonoBehaviour { private void Start() { Show(typeof(Test)); } //用反射获取自定义特性 public void Show(Type t) { var attr = Attribute.GetCustomAttributes(t); foreach (var attribute in attr) { ...
本文用于记录一些使用Shader实现的基础性效果
Unity2020.3.8f1
基础设置创建一个空Shader,可以设置Graph以满足需要。
顶点着色器法线外扩
可以改变一个模型的大小
其中获取法线方向也可以使用:
通过将法线位置(物体本地位置)归一化得到法线,然后乘以一个数值来实现。
模型裁切
原理:AlphaClip的值如果比Alpha的值大,则会不显示
简单效果预览:
加强版本
效果预览
Remap 重映射
根据输入In在InMinMax中的插值,计算输出。(按照比例位置输出)
比如输入In为0,InMinMax时(-10,10),那么In在InMinMax的位置就是0.5,如果OutMinMax为(0,10),那么输出Out就是5公式为: Out = OutMinMax.x + (In - InMinMax.x) * (OutMinMax.y - OutMinMax.x) / (InMinMax.y -InMinMax.x)
One Minus 1减去
输出1-in
Step 阶梯
输入in大于等于 Edge取 1,否则取0
...
最常使用到的就是矢量和矩阵(数学的分支之一——线性代数)
笛卡尔坐标系
大部分的计算位置、距离和角度等变量都是在笛卡尔坐标系下进行的。
二维笛卡尔坐标系
一个特殊的位置,原点,它是整个坐标系的中心
两条过原点相互垂直的矢量,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是如何实现整个渲染流水线的,这些内容对 ...







