HLSL bytecode to GLSL编译器的第一步
来源:互联网 发布:php 发送xml格式报文 编辑:程序博客网 时间:2024/05/21 08:55
HLSL bytecode to GLSL编译器的第一步
转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2012/02/09/hlsl-bytecode-to-glsl%e7%bc%96%e8%af%91%e5%99%a8%e7%9a%84%e7%ac%ac%e4%b8%80%e6%ad%a5/
从KlayGE 4.0开始,不但有为了下一版本开发的短期任务,还有一些中长期研发的任务。其中之一就是HLSL bytecode to GLSL编译器。 现在KlayGE里的shader主要由HLSL写成,通过#ifdef的土办法兼容Cg。对D3D11来说可以直接使用,但对于OpenGL和 OpenGL ES 2就得大费周折了。那种情况下,shader需要经过Cg编译器编译成传统的GLSL,在经过我自己的token级别的编译器转换成现代的GLSL,然后 才能使用。
为什么不直接用Cg?看看Cg runtime在ATI卡上的表现吧。
为什么不用传统的GLSL?NV的驱动有一套attribute和index之间的绑定规则,比如gl_Position一定是 0,gl_Normal一定是6(或者某个数,但是个常量),而且无法通过API来获取预定义attribute的index。这套规则在ATI卡上是不 可用的。现代的GLSL没有预定义的attribute和varing(除了position),所以都可以给定attribute名来获取index, 兼容性好得多。
所以,这里更好的解决方案是把不通过Cg编译器,就把HLSL编译成GLSL。目前有一些能做到这件事情的库,比如AMD的hlsl2glsl(已经停止开发),unity的hlsl2glsl fork(从AMD的发展而来),以及mojoshader。他们的问题在于,只支持到了SM3,对KlayGE来说连最低要求都没达到。只能自己做一个编译器。
如果需要把HLSL直接编译成GLSL,就需要做HLSL的解析等事,既麻烦又不能保证效率。所以我选择了把HLSL编译产生的bytecode解 析出来,生成GLSL。因为HLSL->bytecode可以直接用现成的编译器,省了很多麻烦。(即便是linux上,也可以用wine来执行 d3dx的HLSL编译)
方案明确后,步骤也就能很快定义出来:
- D3D11 bytecode反汇编
- VS/PS to GLSL
- GS/HS/DS to GLSL
在参考了mesa的d3d1x for linux之后,目前已经实现了第一步,反汇编器。下面一段VS:
void DeferredRenderingVS(float4 pos : POSITION,#ifdef NOPERSPECTIVE_SUPPORT out noperspective float2 oTc : TEXCOORD0,#else out float3 oTc : TEXCOORD0,#endif out float3 oViewDir : TEXCOORD1, out float4 oPos : SV_Position){ oPos = mul(pos, light_volume_mvp); oViewDir = mul(pos, light_volume_mv).xyz; oTc.xy = oPos.xy / oPos.w * 0.5f; oTc.y *= KLAYGE_FLIPPING; oTc.xy += 0.5f;#ifndef NOPERSPECTIVE_SUPPORT oTc.z = oPos.w; oTc.xy *= oTc.z;#endif}
经过fxc编译成vs_5_0后,可以用我的disasm反汇编出
vs_5_0dcl_global_flags refactoringAlloweddcl_constant_buffer cb0[12].xyzw, immediateIndexeddcl_input v0.xyzwdcl_output o0.xydcl_output o1.xyzdcl_output_siv o2.xyzw, positiondcl_temps 2dp4 r0.x, v0.xyzw, cb0[8].xyzwdp4 r0.y, v0.xyzw, cb0[9].xyzwdp4 r0.w, v0.xyzw, cb0[11].xyzwdiv r1.xy, r0.xyxx, r0.wwwwmov o2.xyw, r0.xyxwmad o0.xy, r1.xyxx, l(0.5, -0.5, 0, 0), l(0.5, 0.5, 0, 0)dp4 o1.x, v0.xyzw, cb0[4].xyzwdp4 o1.y, v0.xyzw, cb0[5].xyzwdp4 o1.z, v0.xyzw, cb0[6].xyzwdp4 o2.z, v0.xyzw, cb0[10].xyzwret
与fxc的反汇编结果完全一致。ps_5_0的测试也可以通过。
HLSL bytecode to GLSL编译器的第一步算是迈出了,接下去我会开始尝试一些GLSL VS/PS的生成工作。
- HLSL bytecode to GLSL编译器的第一步
- HLSL bytecode to GLSL编译器的第一步
- 正式宣布DXBC2GLSL,HLSL字节码到GLSL的编译器
- HLSL内置函数,及HLSL与GLSL的对应函数
- HLSL 、 GLSL 的 Atomic Counter 资源汇总
- 构造编译器的第一步
- GLSL 到 HLSL 参考
- HLSL/GLSL/Cg
- GLSL 到 HLSL 参考
- 配置 VIM 的 HLSL 、 GLSL 的语法高亮文件
- HLSL 与 GLSL 之间的映射关系参考
- GLSL vs HLSL vs Cg
- Visual Studio 2008/2010的一个GLSL, HLSL, Cg语法加亮插件-NShader
- HLSL GLSL CG着色语言比较
- GLSL/HLSL易犯错误和注意点
- GLSL/HLSL易犯错误和注意点
- HLSL GLSL CG着色语言比较
- HLSL GLSL CG着色语言比较
- javaMail学习三 邮件的组织结构
- 调试stvd遇到的问题
- R 语言绘图004-legend()参数详解
- 2015年度APP分类
- Java 多线程之线程间协作
- HLSL bytecode to GLSL编译器的第一步
- android-电话窗口弹出以及LayoutInflater和inflate的用法
- Atom 编辑器快捷键列表汇总整理
- 二分图匹配
- 欢迎使用CSDN-markdown编辑器
- 华为机试——汽水瓶
- Spring AOP动态代理
- [CodeForces 615B]Longtail Hedgehog[DP]
- eclipse最常用的快捷键整理