什么是Shader
图像渲染管线【流水线】(如何把3D的渲染图片呈现在2D图片上)
渲染流水线
生活中的流水线
应用阶段【CPU】
1、准备场景数据
2、粗颗粒剔除
3、设置模型的渲染状态
输出渲染图元
点、线、三角面...
CPU ➡ GPU(CPU向GPU发送渲染命令)
数据加载到显存 | 硬盘HDD 内存RAM 显存VRAM |
设置渲染状态 | 纹理设置 混合设置 透明设置 顶点着色器设置 片元着色器设置... |
调用DrawCall | CPU向GPU发送一条渲染指令,就称之为一次DrawCall |
CPU向GPU发送一条渲染命令![]() ![]() ![]() |
几何阶段【GPU】
GPU绘制
输出屏幕空间的顶点信息
CPU流水线
输入:顶点数据
顶点着色器 | 可编程的 |
空间变换【三维模型变成一个二维图片】 | |
顶点着色 |
曲面细分着色器
可选着色器 |
细分图元 |
几何着色器
可选着色器 |
逐图元着色or产生更多图元 |
裁剪
裁剪看不到的图元 |
![]() |
屏幕映射
图元转换到屏幕坐标系 |
![]() |
光栅化阶段【GPU】
生成像素
渲染最终图像
GPU流水线 | 三角形设置【画上三角形】 | ||||
三角形遍历【填充像素】 | |||||
| |||||
| |||||
输出:屏幕图像 |
渲染绘图管线整理
目的
输入:3D模型
输出:2D图片
渲染绘图管理流程
渲染绘图管理流程 |
| ||||||||||||
面处理 | 面的组装————面截取、面剔除 | ||||||||||||
光栅化 | 向量 ➡ 点阵像素 | ||||||||||||
|
DX和OpenGL
GPU编程语言
GLSL【英伟达开发】 | 跨平台 |
依赖硬件而非操作系统 | |
HLSL【微软开发】 | 只支持微软平台 |
依赖操作系统,不依赖硬件 | |
CG【C for graphic】 | 真正意义的跨平台【不依赖操作系统也不依赖硬件】 |
与HLSL语法很像【针对于图形学的C语言】 |
ShaderLab【UnityShader的服务语言】
UnityShader类型
固定管线着色器【Shader 1.0】 | 应用于旧设备,不支持可编程Shader的 简单 灵活度低 用到ShaderLab语法,无CG语言 |
表面着色器 | 【Unity自主封装】 省去烦人细节设置 用到CG |
顶点片元着色器【Shader 2.0】 | 复杂 灵活度高 用到CG |