【240816】GLSL 和 HLSL 是基于图形API实现的吗?图形API写出来的程序是CPU运行的,shader写出来的程序是GPU运行的,是这个区别吗?

480 阅读4分钟

以下内容源自于 GPT:

1. GLSL 和 HLSL 的实现依赖于图形API

GLSL(OpenGL Shading Language)和 HLSL(High-Level Shading Language)本质上是与特定图形API(OpenGL 和 Direct3D)紧密绑定的着色器语言。它们是为这些图形API设计的,不能独立于这些API单独运行。也就是说:

  • GLSL 是为 OpenGL 设计的着色器语言,必须在使用 OpenGL 的上下文中运行。
  • HLSL 是为 Direct3D 设计的着色器语言,必须在使用 Direct3D 的上下文中运行。

离开了这些图形API,GLSL 和 HLSL 是无法直接工作的,因为它们的编译、加载、执行等都依赖于这些API的支持。图形API负责将这些着色器编译成适合GPU执行的二进制代码,并将其上传到GPU中进行执行。

2. CPU 和 GPU 运行的区别

你描述的区别是正确的:

  • 图形API的代码: 主要在 CPU 上运行。开发者使用图形API编写的代码(如使用OpenGL或Direct3D的代码)通常在CPU上执行,负责设置图形渲染的状态、管理资源(如纹理、缓冲区)、提交绘制命令等。

  • Shader(着色器)的代码: 主要在 GPU 上运行。着色器代码(使用GLSL或HLSL编写的代码)是专门为GPU设计的。这些着色器程序在图形API的支持下,被编译成GPU能够理解和执行的指令,并在GPU上并行运行,负责处理顶点变换、像素着色、光照计算等图形渲染任务。

总结

  • GLSL 和 HLSL 是依赖于图形API的。它们不能脱离OpenGL和Direct3D独立工作。
  • 图形API代码运行在CPU上,负责控制和管理图形渲染流程。
  • Shader代码运行在GPU上,负责实际的图形处理和渲染操作。

游戏引擎与图形 API 和 shader

游戏引擎通常支持多种图形API和着色器语言,以便在不同平台和设备上运行。以下是对Unity引擎、Unreal Engine(UE)和其他游戏引擎在图形API和着色器支持方面的概述:

1. Unity引擎

  • 图形API支持:

    • 跨平台支持: Unity 引擎支持多种图形API,包括 OpenGL、DirectX、Vulkan、Metal 等。Unity 会根据平台自动选择最合适的图形API。
    • Windows: 支持 DirectX(主要是 DirectX 11 和 DirectX 12)以及 OpenGL。
    • macOS: 支持 Metal 和 OpenGL。
    • Linux: 支持 OpenGL 和 Vulkan。
    • 移动平台: Android 上支持 OpenGL ES 和 Vulkan,iOS 上支持 Metal 和 OpenGL ES。
  • 着色器语言支持:

    • Unity 使用一种称为 ShaderLab 的着色器语言,它可以用 Cg/HLSL 语言编写。这意味着你可以在 Unity 中编写兼容 HLSL 的着色器,同时 Unity 也提供了 ShaderLab 语言来封装和配置着色器。
    • Unity 还支持通过使用 HLSL 和自定义渲染管线(如 URP 和 HDRP)编写更高级的着色器代码。

2. Unreal Engine(UE)

  • 图形API支持:

    • 跨平台支持: Unreal Engine 支持多种图形API,类似于 Unity,根据目标平台自动选择。
    • Windows: 支持 DirectX(主要是 DirectX 11 和 DirectX 12)以及 Vulkan。
    • macOS: 支持 Metal 和 OpenGL。
    • Linux: 支持 Vulkan 和 OpenGL。
    • 移动平台: Android 上支持 Vulkan 和 OpenGL ES,iOS 上支持 Metal 和 OpenGL ES。
  • 着色器语言支持:

    • Unreal Engine 使用一种称为 HLSL 的着色器语言。UE 的材质编辑器允许用户通过节点图形化地创建着色器,但底层使用的还是 HLSL。
    • Unreal Engine 也支持自定义着色器代码,通过编写 HLSL 代码直接与引擎集成。

3. 其他游戏引擎

  • Godot Engine:

    • 图形API支持: Godot 支持 OpenGL、Vulkan(Godot 4.x及以上版本)以及 ES 2.0 和 ES 3.0。
    • 着色器语言: Godot 使用 GDScript(类似 Python 的语言),但着色器编程使用自己的着色器语言,类似于 GLSL。
  • CryEngine:

    • 图形API支持: 支持 DirectX、Vulkan 和 OpenGL。
    • 着色器语言: 使用类似于 HLSL 的语言。

总结

游戏引擎通常支持多种图形API,以便在不同平台上运行,并且可以通过设置或自动选择来适应目标设备。着色器语言方面,Unity 和 Unreal Engine 都支持 HLSL,而其他引擎如 Godot 和 CryEngine 可能会使用自己的着色器语言或类似的着色器语言。引擎提供的高级抽象和工具使得开发者可以更容易地创建跨平台的游戏和应用。