文章

shader入门基础知识一

shader入门基础知识一
  • content

开始编写着色器前我们需要了解的一些基础知识

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