[Unity3D]Shader学习笔记之图像编程接口与着色语言

时间:2022-07-02 03:46:34

图像编程接口

  如果开发者直接访问CPU、寄存器、显存等硬件设备将会是一件非常麻烦的事情,为了方便使用在这些硬件的基础上实现了一层抽象,这就是图像编程接口
  OpenGL和DirectX就是这些图像编程接口,这些接口用于渲染二维或三维图形。这些接口架起了上层应用程序和底层GPU的沟通桥梁。
  一个应用程序向这些接口发送渲染命令,而这些接口会依次向显卡驱动(Graphics driver)发送渲染命令也称为Draw Call,这些显卡驱动是真正知道如何和GPU通信的角色,它们把OpenGL或者DirectX的函数调用翻译成GPU能够识别的语言,同时它们也负责把相关数据转换成GPU所支持的格式。显卡驱动就好比是显卡的操作系统。
  一个显卡除了有图像处理单元GPU之外,还拥有自己的内存,这个内存通常被称为显存(Video Random Access Memory, VRAM)。GPU可以在显存中存储任何数据,但对与渲染来说一些数据类型是必须的,例如用于屏幕显示的图像缓冲、深度缓冲等。
  图像编程接口一个显卡制作商为了让他们的显卡可以同时和OpenGL和DirectX合作,就必须提供支持OpenGL和DirectX接口的显卡驱动。

[Unity3D]Shader学习笔记之图像编程接口与着色语言

着色语言

  着色语言(Shading language)是专门用于编写着色器的,常见的着色器语言有:

  • DirectX的HLSL(High Level Shading Language)
  • OpenGL的GLSL(OpenGL Shading Language)
  • NVIDIA的Cg(C for Graphic)。

  HLSL、GLSL、Cg都是“高级(High Language)”语言,但这种高级是相对于汇编来说的,而不是像C#相对与C的高级那样。这些语言会被编译成与机器无关的汇编语言,也被称为中间语言(Intermediate Language, IL),这些语言再交给显卡驱动来翻译成真正的机器语言,即GPU可以识别的语言。
  GLSL的有点在于它的跨平台性。由于OpenGL没有提供着色器编译器,而是由显卡驱动来完成其编译工作,所以只要显卡驱动支持对GLSL的编译它就可以运行,即GLSL是依赖硬件的,而非操作系统层级的。
  相对于HLSL,是有微软控制着色器的编译,就算使用不同的硬件,同一个着色器的编译结果也是一样的(前提是版本相同)。先也因此支持的平台相对比较有限,几乎都是微软自己的产品,这是应为在其他平台上没有可以编译HLSL的编译器。
  Cg是真正意义上的跨平台。它会根据平台的不同,编译成相应的中间语言。Cg语言可以无缝移植成HLSL代码,缺点是无法发挥出OpenGL的最新特性。

[Unity3D]Shader学习笔记之图像编程接口与着色语言