Unity Shader学习1——初识计算机图形学

一. 初识计算机图形学

图形与图形

  • 图像纯指计算机内以位图(Bitmap)形式存在的灰度信息
  • 图形含有几何属性,更强调场景的几何表示,是场景几何模型和景物的物理属性共同组成的
  • 图形主要分成两类:
    • 基于线条信息表示
    • 明暗图(Shading)

GPU 流水线

1. 渲染管线

顶点着色器 --> 光栅化 --> 片段着色器 --> alpha测试 --> 模板测试 --> 深度测试 --> Blend --> Gbuffer --> frontBuffer --> frame buffer -->显示器

1.1 顶点着色器
  • 流水线的第一个阶段,输入来自CPU
  • 处理单位为顶点,即输入的每个顶点都会调用一次顶点着色器
  • 顶点着色器本身无法创建或者销毁任何顶点,也无法得到顶点之间的关系,例如无法知道两个顶点是否属于同一个三角网格
  • 所以GPU可以并行处理每一个顶点,故此阶段处理速度很快

主要工作:坐标转换和逐顶点光照

1.2 光栅化

​ 将顶点转成像素

1.3 片段着色器
  • 纹理采样,从纹理像素 赋给顶点生成的像素
  • 像素跟灯光计算
1.4 Alpha 测试

​ 挑选合格的alpha 像素显示

1.5 模板测试

​ 像素可携带模板信息,达到模板条件的显示出来

1.6 深度测试

​ 符合条件的像素通过,否则丢弃

1.7 Blend

​ 将当前要渲染的像素和已经渲染出来的像素混合运算

1.8 GBuffer

​ RGBA、 模板值 、深度值等

2.屏幕坐标系

屏幕坐标系在OpenGL和DirectX之间存在差异:

  • OpenGL把屏幕左下角当成最小的窗口坐标
  • DirectX则把屏幕左上角当成最小的窗口坐标

Unity Shader学习1——初识计算机图形学

GPU编程语言

GLSL

OpenGL Shading Language

优点:有较好的跨平台性,可在Windows、Linux、Mac甚至移动平台等多种平台上工作

原因:跨平台性是由于OpenGL没有提供着色器编译器,而是由显卡驱动来完成着色器的编译工作,也就是说只要显卡驱动支持GLSL的编译,就能运行它,它依赖硬件,而非系统层级

缺点:因为编译结果取决于供应商,供应商编译实现不尽相同,所以存在编译结果不一致的情况。

HLSL

High Level Shading Language,DirectX

由微软控制着色器的编译,即使不同的硬件,同一着色器的编译结果相同,故而支持HLSL的平台相对有限,几乎都是微软自己的产品,其他平台没有可以编译HLSL的编译器。

CG

C for Graphic

真正意义上的跨平台,会根据平台的不同,编译成相同的中间语言,因为它和微软合作,导致CG语言的语法和HLSL非常相似。CG语言可以无缝移植成HLSL代码。

固定管线渲染

固定函数的流水线(Fixed-Function Pipeline),也称固定管线,指在较旧的GPU上实现的渲染流水线,这种流水线只给开发者提供一些配置操作,开发者没有对流水线阶段的完全控制权。

固定管线通常只提供一系列接口,接口包含一个函数入口点,这些函数入口点匹配GPU上的特定逻辑功能,开发者通过这些接口来控制渲染流水线。

**标注:**已逐渐弃用,不建议继续使用

名词解释

NDC:归一化设备坐标(Normalized Device Coordinates)