引擎设计跟踪(九.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)
引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014的更多相关文章
- 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复
由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...
- 引擎设计跟踪(九.14.2i) Android GLES 3.0 完善
最近把渲染设备对应的GLES的API填上了. 主要有IRenderDevice/IShader/ITexture/IGraphicsResourceManager/IIndexBuffer/IVert ...
- 引擎设计跟踪(九.14.2g) 将GNUMake集成到Visual Studio
最近在做纹理压缩工具, 以及数据包的生成. shader编译已经在vs工程里面了, 使用custom build tool, build命令是调用BladeShaderComplier, 并且每个文件 ...
- 引擎设计跟踪(九.14.2f) 最近更新: OpenGL ES & tools
之前骨骼动画的IK暂时放一放, 最近在搞GLES的实现. 之前除了GLES没有实现, Android的代码移植已经完毕: [原]跨平台编程注意事项(三): window 到 android 的 移植 ...
- 引擎设计跟踪(九.14.2 final) Inverse Kinematics: CCD 在Blade中的实现
因为工作忙, 好久没有记笔记了, 但是有时候发现还得翻以前的笔记去看, 所以还是尽量记下来备忘. 关于IK, 读了一些paper, 觉得之前翻译的那篇, welman的paper (http://gr ...
- 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言
Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...
- 引擎设计跟踪(九.14.2b) 骨骼动画基本完成
首先贴一个介绍max的sdk和骨骼动画的文章, 虽然很早的文章, 但是很有用, 感谢前辈们的贡献: 3Ds MAX骨骼动画导出插件编写 1.Dual Quaternion 关于Dual Quatern ...
- 引擎设计跟踪(九.14.3.4) mile stone 2 - model和fbx导入的补漏
之前milestone2已经做完的工作, 现在趁有时间记下笔记. 1.设计 这里是指兼容3ds max导出/fbx格式转换等等一系列工作的设计. 最开始, Blade的3dsmax导出插件, 全部代码 ...
- 引擎设计跟踪(九.14.2e) DelayLoaded DLLs (/DELAYLOAD)
关于DLL的delay load: http://msdn.microsoft.com/en-us/library/151kt790.aspx 最近在做GLES的shader compiler, 把现 ...
随机推荐
- DOS下无法调出中文输入法-Solved
From:http://www.cnblogs.com/killerlegend/p/3750542.html Author:KillerLegend Date:2014.5.24 DOS下无法打开中 ...
- WebBrowser里网页根据文字判断来点击链接 无Name及ID时
uses ActiveX, ComObj, MSHTML; 根据连接文字点击连接- 一般情况下的连接 Procedure HTMLClinkByText(text:string;Wbr:TWebBro ...
- Oracle 11gR2 RAC修改SCAN IP
一.查看当前环境: # grid用户 检查scan-ip地址的配置 [grid@node1 ~]$ srvctl config scan SCAN name: scan-cluster.com, Ne ...
- DMA直接内存存取20160525
说一下工作中接触到的DMA1)在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题.即DMA传输前,CPU要把 总线控制权交给DMA控制器,而在结束DMA传输后,DMA ...
- flask 开发记录
from flask import request 判断method方式 request.method 'POST', ‘GET’ 获取form内容 request.form['form_name' ...
- Mysql允许外网接入
首先你可以为mysql创建一个账户,或者为root用户接入数据库. 授权用户指定所有主机以指定用户连接服务器 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDE ...
- Oracle表结构转换SqlSERVER表结构 脚本
在审计工作中,有时需要将Oracle的表结构修改后再SqlSERVER中创建表结构,然后将数据导入到SqlSERVER中,在修改表结构的过程中方法狠多.手工修改,最蠢的方法,或者用工具UE批量修改,还 ...
- orcherd 汉化
点击这里下载汉化包,此汉化包是在是在前人的基础上精心整理修改的,后续汉化版本随时升级更新. Orchard汉化包 下载后解压缩后打开后看到如下文件夹(App_Data.Core.Modules.The ...
- 使用Ajax.BeginForm 中需要 上传文件 但 Request.files获取不到
使用Mvc里的插件jquery.unobtrusive-ajax.min.js 之前一直困在这里,一开始以为添加属性enctype="multipart/form-data"就可以 ...
- 007--VS2013 C++ 显示位图半透明化
以后所有图片都放在根目录下: 如有另放,会特别注明 //全局变量HBITMAP bg,girl;HDC mdc; //起始坐标const int xstart = 50;const int ystar ...