zoukankan      html  css  js  c++  java
  • 引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014

    Origin: http://aras-p.info/blog/2014/03/28/cross-platform-shaders-in-2014/

    简译 translation:

    作者在2012年写过一篇shader跨平台的文章, 开始提到了并有链接.

    1.手写或者宏替换

    使用宏定义将 HLSL & GLSL 的不同之处封装, 并让每个开发人员了解他们的不同之处. 例子: Valve的Source 2引擎

    优点: 简单,容易实现
    缺点: 每个开发者都必须熟悉使用宏定义库, 还有其他语法上的不同.

    2.设计自己的Shader Langugage, 并转换为HLSL/GLSL后端代码

    或者使用可视化shader编辑器来动态生成HLSL/GLSL.

    3.将HLSL的byte code翻译成GLSL

    优点: byte code翻译比HLSL翻译更简单. 而且M$的D3DCompile做了很好的优化, 这样从优化后的byte code, 可以直接转为足够优化的GLSL.

    缺点:HLSL的封闭式工具链, 只能在windows上跑. HLSL的编译器做的优化可能太过, 有些优化对于现代显卡没有意义.

    对应的工具:

    • James Jones的HLSLCrossCompiler, 支持DX10/11 byte code到多种GLSL的转换, 目前处于活跃开发状态.
    • Ryan Gordon的MojoShader, 支持DX9, SM1.1 - SM3.0
    • Valve的TOGL, 仍然是DX9, 而且部分支持. (只部分支持SM3.0)
    • (译者附: KlayGE 好像也有DX的byte code 到GLSL的翻译器)

    4.在源代码级别将HLSL翻译为GLSL, 或者GLSL到HLSL

    • hlsl2glslfork - by Unity: DX9的HLSL转换到GLSL 1.xx 和GLSL ES(支持ES3). Unity的产品和其他地方有用到, 确实可用, 不过原代码不怎么好, 而且不支持DX10/11.
    • ANGLE - by Google: OpenGL ES 2.0 (还有3.0?) 转换到DX9/10的HLSL. 这套GLES的模拟器基于D3D, 正好也有shader交叉编译器.
    • OpenGL Reference Compiler -  by Khronos: 本身只是一个GLSL校验器和解析器, 但是可以用来生成HLSL.
    • HLSL Cross Compiler - by Epic UE4: 不开源.希望会开源吧. 可能是基于Mesa GLSL或者glsl optimizer.
    • hlslparser: 来源未知. DX9的HLSL转换到GLSL3.1
    • MojoShader - by Ryan Gordon:好像有DX9 HLSL的解析代码

    原作者是hlsl2glslfork的owner, 使用的是hlsl2glslfork+glsloptimizer(感觉是Unity内部的?).他也曾想过UE4的方式, 用自己的解析器, 或者Mesa 的GLSL栈, 替换掉hlsl2glslfork, 因为Mesa的GLSL代码比hlsl2glslfork的好, 而且支持SM3.0以后的特性,但是他没有时间做.

    总结:

    作者认为, 目前看来, 最终需要使用两种shader了. 独立于硬件(可以在不同硬件上跑的shader)的方案不太可行. 比如nVidia的Cg, 现在基本停止开发了.(可能是因为Cg太早了, 如果换做现在或许会好点).

    翻译DX9 HLSL的方式, 这个基本已经有了解决方案, 比如hlsl2glslfork, mojoshader, ANGLE. 但是目前缺乏DX10/DX11级别的翻译/转换工具, 只有byte code级别的.

    (参考: Bringing Unreal Engine 4 to OPENGL)

  • 相关阅读:
    (Good Bye 2019) Codeforces 1270B Interesting Subarray
    (Good Bye 2019) Codeforces 1270A Card Game
    Codeforces 1283D Christmas Trees(BFS)
    Codeforces 1283C Friends and Gifts
    Codeforces 1283B Candies Division
    1095 Cars on Campus (30)
    1080 Graduate Admission (30)
    1099 Build A Binary Search Tree (30)
    1018 Public Bike Management (30)
    1087 All Roads Lead to Rome (30)
  • 原文地址:https://www.cnblogs.com/crazii/p/4192259.html
Copyright © 2011-2022 走看看