shader入门基础知识一
shader入门基础知识一
- content
开始编写着色器前我们需要了解的一些基础知识
- 什么是渲染管线
gpu 内部处理图形信号相互独立的并行单元,一个渲染管线(流水线)是一序列可以并行和按照固定顺序进行的阶段。 - Shader
通用的 shader 是渲染流水线的某些特定阶段,例如顶点着色器阶段(vertex shader)和片元着色器阶段(fragment shader) TODO 渲染流水线 - UnityShader
Unity 为开发者提供的高层级的渲染抽象层,而所有 UnityShader 都是有 ShaderLab 编写的,ShaderLab 是 unity 提供的编写 Unity Shader 的一种说明性语言, 使用 ShaderLab 后开发者将不需要和许多文件和设置打交道 - 着色器语言 ShadingLaguage
- DirectX 的 HLSL(High Level Shading Language)
- OpenGL 的 GLSL (OpenGL Shading Language)
- NVIDIA Cg (C for Graphic)
- 选择哪种语言呢?
首先 GLSL 是跨平台的,但是 GLSL 得跨平台是由于 OpenGL 没有提供着色器编译器,而是由显卡驱动来完成着色器的编译工作,因此 GLSL 是依赖硬件而非操作系统的,对于 不同的硬件,编译结果会不一致。对于手游或者端游开发,我们依赖的是操作系统级的,而非硬件。 HLSL 是微软控制着色器编译,对于不同硬件,相同编译器编译结果是相同的 CG 根据平台不同,会编译成相应的中间语言,而 cg 是和微软合作的产物,因此语法和 HLSL 相像 在 Unity 中我们可以认为是等价的,因此后续我们使用”Cg/HLSL”来编写我们的着色器 - 什么是 DirectX,OpenGL
DirectX,OpenGL 是图像应用层的编程接口,这些接口用于渲染二维或者三维图像 - 什么是 DrawCall,为什么 DrawCall 多了会导致帧率下降
DrawCall cpu 调用图像编程接口,以命令 Gpu 进行渲染的操作 eg. DirextX 中的 DrawIndexedPrimitive。 每次调用 DrawCall 前,cpu 需要向 GPU 发送很多内容,包括数据,状态,命令等,在这一阶段 cpu 需要完成很多工作,例如检查渲染状态等。 完成后 gpu 开始渲染,gpu 渲染能力很强,渲染 200 或者 2000 个三角网格通常花费差不多,真正造成帧率下降的原因是 cpu 在 DrawCall 过多 之后,会花费大量时间在准备上述工作和提交 DrawCall 上。
本文由作者按照 CC BY 4.0 进行授权