Unity杂谈-SRP为何再也不使用CG

这是知乎上的一个问题: 新版Unity shader库为何用HLSL,而不用CG了?工具

正好和我以前看到几篇文章相关, 因此整理一下作一个笔记.spa

跨平台shader编译的过去、如今和将来 - 知乎
做者是叛逆者, 在KlayGE的开发过程当中, 自己有跨平台编译着色器的需求.
本文介绍了做者遇到的问题以及解决方案.
这是一篇2017年的文章, 一直到加入了SPIR-V, 支持Vulkan为止.

Shader交叉编译之梦 - 知乎
做者仍是叛逆者, 介绍了他的开源项目:Microsoft/ShaderConductor, 用于链接DirectXShaderCompiler和SPIRV-Cross.
和上文相比, 流程图中多了Metal的MSL.
写做时间在2018年

跨平台引擎Shader编译流程分析 - 知乎
做者是周泰, 本文介绍了UE和Unity的编译流程, 其中Unity部分分红两代.
若是看过了前面两篇文章, 那么对这篇文章的理解不会太困难.
写做时间在2019年blog

首先看Unity前期为何使用Cg, 由于Cg能打通HLSL和GLSL.开发

首先HLSL和Cg语言类似, 差别部分能够用宏来处理, 而Cg到HLSL能够由其余工具进行转换.get

Cg自己的编译器就能够提供Cg到GLSL的转换, 可是叛逆者在文中也说了, 生成的GLSL遵照的是NVIDIA的规矩, 对AMD, Intel的支持就有问题.编译器

固然对于Unreal Engine或者Unity来讲, 固然有能力本身维护一份转换的代码.it

比较下面两张图, 第一张是Unity初期的流程, 第二张图是KlayGE的第二版流程

io

 

 

再日后各类着色器语音不断发展, 而Cg则在2012年以后再无更新.
在功能上, 看看上图中被打叉的Hull Shader, Domain Shader和Compute Shader.
在跨平台方面呢, 向Vulkan, Metal的线也难以链接.编译

这个时候SPIR-V成为了链接全部着色语言新的桥梁.im

微软推出了DirectXShaderCompiler, 能够把HLSL编译为SPIR-V, 可直接用于Vulkan和较新的OpenGL.

Khronos Group则推出了SPIRV-Cross, 能够把SPIR-V转换为OpenGL的GLSL, OpenGL ES的ESSL, Metal的MSL.

这样就把全部的着色语言链接了起来, 至于Cg, 很遗憾, 已经没有它的位置了.

下面这张图是Unity如今的流程图

相关文章
相关标签/搜索