Shader必备基础

渲染管线概述

他是计算机图形学中用于将三维场景数据经过一系列的阶段性处理转化为最终屏幕所见图像的过程。

三维场景数据包括:

  • 顶点数据:模型顶点坐标、法线向量等
  • 纹理数据:纹理贴图
  • 光照数据:光照参数、信息等

阶段:

应用阶段、集合阶段、光栅化阶段

Unity的渲染管线

Unity中的渲染管线和计算机图形学中的渲染管线基本上是相同的概念,但是Unity的渲染管线是建立在图形学基础上,有自己的实现和拓展,提供了高度可配置和可拓展的框架,允许开发者可自定义渲染流程

应用阶段

大部分内容和渲染无关,但是为渲染管线的后续提供了最重要的内容——数据,主导者——CPU

  • 将不可见的物体数据剔除
  • 准备模型的相关数据
  • 将数据加载到显存中
  • 设置渲染状态(网格需要使用哪个着色器、材质、光源属性等)
  • 调用DrawCall

DrawCall:

CPU通过图像编程接口向命令缓冲区添加命令[模型数据和渲染状态的命令]的动作,GPU会从这个缓冲区读取命令。

性能瓶颈在于CPU,所以使用批处理、合并网格、共用材质、合并图集等减少DrawCall可以提升性能

几何阶段

图元

是几何数据的基本单位,是构成几何体的最小可绘制单元,代指的是顶点数据组合成的点、线、三角形,在后续的光栅化阶段这些图元会被转换为像素

GPU主导,给开发者开放了部分控制权

几何阶段工作内容:

  • 顶点着色器(完全可编程) :应用阶段传递来的每一个顶点数据都被调用一次顶点着色器的逻辑,主要是
    • 坐标转换——顶点变换、法线变换、纹理变换等
    • 顶点属性处理——顶点颜色、透明度、切线向量等
    • 顶点插值——顶点属性的插值计算
  • 曲面细分着色器、几何着色器:可选的着色器,需要硬件和驱动支持,略
  • 裁剪:自动将不在视野内和部分在视野内的图元进行裁剪
  • 屏幕映射:将三维坐标下的图元坐标转换到屏幕坐标系中

光栅化阶段

像素:

组成图像的最小可控单位,具有位置和属性(颜色、深度值、法线等),二位图像的一个点

片元:

光栅化阶段生成的像素或者像素片段,是渲染管线中进行像素级操作和计算的基本单位

光栅化阶段工作内容:

  • 三角形设置:几何阶段传过来的只有顶点的数据,但是要得到一个三角形网格对像素的覆盖情况,就必须计算每条边上的像素坐标,这样就明确了三角形的网格表示数据
  • 三角形遍历:计算每个像素是否被三角形网格覆盖,覆盖则生成一个片元。也被称为“扫描变换阶段”
  • 片元着色器(完全可编程)
    • 光照计算——计算片元光照效果
    • 纹理映射——对纹理采样,将纹理颜色映射到片元上,实现贴图效果
    • 材质属性处理——根据材质的属性(颜色、透明度、反射率等),计算片元的颜色和透明度
    • 阴影处理——根据光源信息,计算是否处于阴影中,影响最终颜色
    • 等等
  • 逐片元操作:对片元进行可见性测试,通过了将片元的颜色值和颜色缓冲区的颜色合并等等

三角形遍历简化计算过程:

三角形遍历简化计算过程

如何学习Shader开发

Shader是什么:

Shader中文就是着色器,是一种用于描述如何渲染图形和计算图形外观的程序,重要用于控制图形的颜色、光照、纹理和其他视觉效果

Shader开发就是基于渲染管线的某些阶段的自定义开发,修改屏幕上的表现效果。主要是顶点着色器和片元着色器阶段

基础知识:

  1. 数学相关知识——向量、线性代数(矩阵计算相关知识)
  2. 语法相关知识——Unity中的ShaderLabel语法、着色器开发的CG语法
  3. 着色器开发相关知识——效果处理的计算规范:
    • 光照效果颜色如何通过计算得到
    • 纹理颜色应该如何从图片中得到
    • 透明效果、阴影效果应该如何计算处理
    • 等等

图形接口程序(OpenGL、DrectX):

提供了对渲染管线的控制和管理功能,是开发者与硬件的中间层

Shader与图形接口程序的关系:

图形接口程序为Shader开发提供了API,不同的图形接口程序需要使用不同的Shader开发语言来调用相关API:

  • OpenGL : GLSL
  • DX: HLSL
  • Metal : MSL
  • WebGL : GLSL ES

DX坐标原点位于屏幕左上角、其他位于左下角(最新的DX12可以设置成左下角)