Done is better than perfect

0%

什么渲染管线

渲染管线跟工厂的流水线一样,工厂的流水线为了生成最终的一个产品,每个流水线的工人只干一件特定的事情,最后将一个产品完成。计算机的图形渲染管线和工厂的流水线一样,只是图形渲染管线最终生成的是一张二维图片。 我们将一个渲染流程分成3个阶段:应用阶段几何阶段光栅化阶段。注意这仅仅是概念性阶段,每个阶段本身通常也是一个流水线系统,即包含了子流水线阶段。如下图: 渲染流水线三个概念图

  • 应用阶段

从名字我们可以看出,这个阶段是由我们的应用主导的,因此通常由CPU负责实现。换句话说,我们这些开发者具有这个阶段的绝对控制权。 在这阶段中,开发者有3个主要任务: 1. 我们要准备好场景数据,例如摄像机的位置、视椎体、场景中包含了哪些模型、使用了哪些光源等等; 2. 为了渲染性能,我们往往需要做一个粗粒度剔除(culling)工作,以把哪些不可见的物体踢出去,这样就不需要再移交给几何阶段进行处理; 3. 最后我们要设置好每个模型的渲染状态,这些渲染状态包括但不限于它们使用的材质(漫反射颜色、高光反色颜色)、使用的纹理、使用的Shader等。 这一阶段最重要的输出是渲染所需的几何信息,即渲染图元(rendering primitives)。通俗来讲,渲染图元可以是点、线、三角面等。这些渲染图元将会被传递给下一个阶段——几何阶段。

  • 几何阶段

几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎么绘制它们,在哪里绘制它们。这一阶段通常在GPU上进行。 几何阶段负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。这个阶段可以进一步分成更小的流水阶段,这在下一章中会讲到。几何阶段的一个重要任务就是把顶点坐标变换到屏幕空间中,再交给光栅器进行处理。通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值,着色相等相关信息**,并传递给下一个阶段。

  • 光栅化阶段

这一阶段将会使用上个阶段传递的数据来生成屏幕上的像素,并渲染出最终的图像。这个阶段也是在GPU上运行。光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。它需要对上一个阶段得到的逐顶点数据(例如纹理坐标,顶点颜色等)进行插值,然后在进行逐像素处理。和上一个阶段相似,光栅化阶段也可以分成更小的流水线阶段。

阅读全文 »

前言

Mathjax是一种支持在所有浏览器上显示数学公式的Javascript引擎,它支持绝大部分的Tex/LaTex语法,并且有三种输出HTML/CSS, SVG(矢量图)和MathML(Firefox支持的数公式标记语言)。本文主要介绍如何在将Mathjax整合进入Hexo中,在整合之前先介绍一下Tex/LaTex。

阅读全文 »

Canvas的渲染

渲染基本层次

基本渲染层次是根据可视化对象在继承窗口中的显示顺序来渲染的,在此有两种方式可以调节对象的顺序。第一种:直接在继承窗口拖拽。第二种:通过Transform的SetAsFirstSibling, SetAsLastSibling, and SetSiblingIndex函数来进行调节。

渲染模式

  • 屏幕覆盖模式

直接屏幕映射方式显示,永远在屏幕的最上面,跟相机无关即使没有相机也可以显示

  • 屏幕相机模式

此模式和屏幕模式相似但是受到相机的限制,但是始终都显示在相机的前面,如果有3D物体在UI的前面也是会挡住UI。

  • 世界模式

把Canvas当成普通的对象在世界坐标系中定位渲染。

阅读全文 »

基础回顾

在正式分析UGUI源码前,让我们回顾一下,模型的组成,以及渲染。

模型组成

模型是由一系列的三角形组成,三角形又是由三个顶点构成的,每个顶点上保存了相关的顶点属性(顶点位置,顶点颜色,顶点UV,顶点法线,顶点切线)在Unity中使用Mesh类来表示。

模型渲染

模型筛选:

  1. 首先根据相机的Culling Mask剔除那些不需要此相机渲染的模型。
  2. 然后根据摄像机的视锥体大小,剔除完全在视锥体外的模型。

模型分类:

Unity将根据需要渲染的模型Shader中RenderQueue对模型进行分类,分为不透明模型(小于2500)和透明模型(大于等于2500)。

排序渲染模型:

  1. 首先通过sortLayer和sortingOrder对不透明模型进行进行排序,越低的越先渲染;然后再通过Shader中的RenderQueue进行排序;再然后就通过包围盒中心点的深度(距离摄像机的位置)进行排序;最后如果深度相同则还可以通过ZBias进行深度调节。
  2. 透明物体同样的使用上述规则进行排序。
阅读全文 »

本文主要基于Blender创建一个简单的机器人,并基于此机器人来了解骨骼动画的制作流程。制作骨骼动画主要包含以下步骤:

  1. 建模
  2. 构建骨骼
  3. 蒙皮和权重绘制
  4. 动画制作
阅读全文 »

Unity实现序列帧动画主要有两种方式,一个是通过Unity自带的Animation进行制作,二是根据序列帧动画原理通过代码按固定帧率切换显示的图片即可实现序列帧动画效果。

阅读全文 »

为什么要使用协程

为什么要使用协程?,先来看段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using UnityEngine;

public class TestCoroutine : MonoBehaviour
{
void Start()
{
StartCoroutine(CoroutineFunc());
}

IEnumerator CoroutineFunc()
{
var wfeof = new WaitForEndOfFrame()
//1000次循环大概1s
for(int i = 0; i < 1000; i++)
{
//假设做大量的工作,大概CPU耗时:0.1s
DoManyWork();
yield return wfeof;
}
}

void DoManyWork()
{
Debug.Log("DoManyWork is called.");
}
}

上面的CoroutineFunc函数里面消耗了大量的CPU时间,在没有协程的开发环境中,比如像C/C++这样的开发语言,一般会创建一个线程来执行这种耗时的操作,多线程开发也会牵扯到各种数据和资源的互斥访问和线程同步的问题,这也导致在其他线程访问Unity引擎相关的组件会出现问题,因为我们没法控制其他的线程在访问操作一个对象时Unity引擎不去访问它,所以在Unity中其他线程一旦访问Unity引擎相关的组件就可能回出错。因此为让Unity的主线程不被这种耗时的操作给卡住,就只有将这种耗时的操作分到多帧里去执行,所以就出现了这种伪线程即协程。

阅读全文 »

委托

什么是委托?委托与事件有什么关系呢?先来看一下委托的定义,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
namespace DotnetExample
{
//定义一个委托
public delegate void VoidCallback();

// Console必须要一个Main函数才能编译通过
class Program
{
static void Main(string[] args)
{
}
}
}
阅读全文 »

介绍

.Net是什么呢?.Net是1998年微软剑桥研究院的技术人员研究的下一代开发技术,并将其制定的规范(CLI)提交到了ECMA,形成了ECMA335规范, 随后被ISO采纳为国际标准ISO/IEC 23271:2012。到2002微软正式发布了.NET Framework 1.0。.NET Framework是.Net开发技术规范的第一个实现,所以在初期.Net和.Net Framework指的是同一个东西,但它们本质上是完全不同的。由于当时只有微软的.Net Framework实现了.Net标准所以也仅限于Windows开发栈。.Net Framework平台的内容包含很多组件和库,像WinForm, WebForm, WPF,Asp.net等。直到2004年Mono让其可以在Linux上运行了,慢慢的Mono也开始支持Android, iOS,MacOSx让.Net实现跨平台。

阅读全文 »

下载相关工具

下载CentOS8 系统镜像

官方下载地址:https://www.centos.org/download/,根据自己的情况选择下载什么镜像,阿里云和网易的镜像地址下载速度很快。本文下载的是CentOS-8.2.2004-x86_64最小化版,如果需要带GUI的系统可以下载完整版,各个版本的下载地址:

  1. 最小版本:http://mirrors.aliyun.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-minimal.iso

  2. 完整版:http://mirrors.aliyun.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-dvd1.iso

阅读全文 »