• Unity杂谈-SRP为什么不再使用CG


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

    正好和我之前看到几篇文章相关, 所以整理一下做一个笔记.

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

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

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

    首先看Unity前期为什么使用Cg, 因为Cg能打通HLSL和GLSL.

    首先HLSL和Cg语言相似, 差异部分可以用宏来处理, 而Cg到HLSL可以由其他工具进行转换.

    Cg本身的编译器就可以提供Cg到GLSL的转换, 但是叛逆者在文中也说了, 生成的GLSL遵守的是NVIDIA的规矩, 对AMD, Intel的支持就有问题.

    当然对于Unreal Engine或者Unity来说, 当然有能力自己维护一份转换的代码.

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

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

    这个时候SPIR-V成为了连接所有着色语言新的桥梁.

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

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

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

    下面这张图是Unity现在的流程图

  • 相关阅读:
    JavaScript总结(一)
    序列化函数
    random与os,sys模块
    认识模块
    时间模块
    日志处理
    异常处理
    类的约束
    反射
    区分函数以及方法
  • 原文地址:https://www.cnblogs.com/yusjoel/p/13272524.html
Copyright © 2020-2023  润新知