
2012年2月9日
转载请注明出处为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:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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反汇编出
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
vs_5_0
dcl_global_flags refactoringAllowed
dcl_constant_buffer cb0[12].xyzw, immediateIndexed
dcl_input v0.xyzw
dcl_output o0.xy
dcl_output o1.xyz
dcl_output_siv o2.xyzw, position
dcl_temps 2
dp4 r0.x, v0.xyzw, cb0[8].xyzw
dp4 r0.y, v0.xyzw, cb0[9].xyzw
dp4 r0.w, v0.xyzw, cb0[11].xyzw
div r1.xy, r0.xyxx, r0.wwww
mov o2.xyw, r0.xyxw
mad 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].xyzw
dp4 o1.y, v0.xyzw, cb0[5].xyzw
dp4 o1.z, v0.xyzw, cb0[6].xyzw
dp4 o2.z, v0.xyzw, cb0[10].xyzw
ret
|
与fxc的反汇编结果完全一致。ps_5_0的测试也可以通过。
HLSL bytecode to GLSL编译器的第一步算是迈出了,接下去我会开始尝试一些GLSL VS/PS的生成工作。
posted @ 2012-02-09 13:16 龚敏敏 阅读(442) 评论(0)
编辑

2012年2月6日
转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2012/02/06/the-next-gen-benchmark-software-klaymark-announced/
经过长时间的筹划,今天正式宣布开始次世代评测软件KlayMark的开发。
简介
KlayMark将以KlayGE为引擎,定位为一款集各种先进渲染技术于一身的跨平台评测软件。在提供赏心悦目的画面同时,对系统的性能作出综合评价。不论是PC平台还是移动平台,KlayMark将提供统一的计分方式,使得不同平台之间的得分具有可比性。
虽然动用到许多新技术,但KlayMark仍会保持极高的效率、较低的配置、良好的跨平台能力等特点。
发布计划
KlayMark的源代码将迟于二进制版本发布,类似Doom和Quake的方法。
由于平台的差异,KlayMark 1.0的发布将分拨进行。
Wave 1:预计开发周期1年。Windows平台支持D3D10+和OpenGL,Android平台支持Tegra 2+的平板。
Wave 2:Android平台支持PowerVR 5+、Mali-4+的平板和手机,支持iOS平台。
Wave 3:支持MacOSX和Linux。
posted @ 2012-02-06 19:18 龚敏敏 阅读(804) 评论(3)
编辑

2011年12月25日
转载请注明出处为KlayGE游戏引擎
从KlayGE 4.0开始,KlayGE转为使用双协议。默认的协议仍然是开放源代码的GPL。对于不适合用GPL的用户,在缴纳授权费的情况下,可以选择另一个协议,称为KlayGE Proprietary License(KPL)。因此对于需要避开GPL条款的用户,也有机会为项目购买另一个协议的KlayGE。
详细情况请见Licensing。
posted @ 2011-12-25 15:00 龚敏敏 阅读(1109) 评论(1)
编辑
转载请注明出处为KlayGE游戏引擎
经过KlayGE团队半年的努力,KlayGE 4.0.0正式发布了!作为一个大版本,KlayGE开始由一堆发散的功能集走向一个以Deferred Rendeirng为核心的系统。并且开始支持新平台Android。主要更新如下:
- Deferred Rendering layer集成到核心中
- 全局光照得到了很大的加速
- 支持Android(在王锐的协助下完成)
- 支持实时焦散(由Parsifal Wang完成)
- 蒙皮动画支持Dual quaternion(由Honyeung Lau、Xiaoyang Zhu完成)
- 增加了资源载入框架(由郭鹏设计)
- 改进的SSVO(由吴野完成)
- 骨骼数据压缩
- 用Phong Tessellation代替PN-Triangles
- 支持渲染到纹理数组
- 支持parallax occlusion mapping
从此处下载KlayGE 4.0.0。
与此同时,从4.0开始,KlayGE转为使用双协议:开放源代码的GPL和封闭的KlayGE Proprietary License(KPL)。详细情况请见Licensing。
posted @ 2011-12-25 14:04 龚敏敏 阅读(1305) 评论(3)
编辑
转载请注明出处为KlayGE游戏引擎
在KlayGE的空框架跑起来之后,经过几天艰苦的debug,修正了多个KlayGE的bug,绕开更多Android的bug。现在,Text和Vertex displacement两个例子已经能在Android上顺利执行了。
Text例子。乱码不是bug,只因为系统区域没设置成中文。
Vertex displacement例子。
在移植的过程中,遇到的一个麻烦是NDK的ANativeWindow_getWidth和ANativeWindow_getHeight总是返 回1,无法得到正确的窗口大小。结果viewport被错误地设置成1×1,使得渲出的东西都只有1个pixel。在修改了 native_app_glue,获取resize的消息后,viewport大小终于得到了正确的设置。那两个例子才因此能正常执行。从这里也可以看 出,Android的NDK千疮百孔,开发的时候要异常小心。
另一个事情是,Android x86在EeePC 701的i915上是用Mesa软件执行OpenGL ES 2的(至少,我还没找到让它不fallback的方法),所以帧速率非常低。
至此,KlayGE for Android的第一阶段已经完成,即引擎核心已经完成移植。下个阶段会让更多的例子能在Android上执行。
posted @ 2011-12-25 14:03 龚敏敏 阅读(610) 评论(1)
编辑

2011年12月18日
转载请注明出处为KlayGE游戏引擎
glloader,KlayGE游戏引擎的 一个子项目,是一个OpenGL扩展载入库。它可以载入OpenGL 1.0-4.2,OpenGL ES 1.0-2.0,同时也支持WGL、GLX、EGL和其他GL/GLES扩展,只要编写xml脚本就能自动生成扩展载入代码。glloader有一个 XML格式的数据库,包含了GL/GLES的所有入口函数、标示和类型定义。
在这个新版本中,glloader有了Android版,同时GL/GLES/EGL registry里的所有最新的扩展也都支持了。
请从这里下载。
posted @ 2011-12-18 15:24 龚敏敏 阅读(837) 评论(0)
编辑
转载请注明出处为KlayGE游戏引擎
由于sourceforge和bitbucket在国内的访问速度较慢,我在codeplex上申请了个空间http://klayge.codeplex.com/用于存放KlayGE的repository。Mercurial clone的地址是https://hg01.codeplex.com/klayge。如果你不满现在的访问速度,可以考虑用这个新的。
posted @ 2011-12-18 15:23 龚敏敏 阅读(748) 评论(0)
编辑
转载请注明出处为KlayGE游戏引擎
继glloader移植到Android之后,KlayGE也可以在Android上执行了。虽然,严格来说,只是能跑最最基本的空框架。
由于我没有Android真机,模拟器又无法执行OpenGL ES 2,所以我的测试方法是在最老的Asus EeePC上执行Android x86。空框架EmptyApp目前可以顺利执行:

是的,只有Clear,没有文件读取、没有字体渲染。但作为第一步,这是必不可少的。
posted @ 2011-12-18 15:19 龚敏敏 阅读(1044) 评论(0)
编辑

2011年12月8日
转载请注明出处为KlayGE游戏引擎
glloader,作为KlayGE的一个子项目,是OpenGL扩展载入库,可以载入OpenGL 1.0-4.2,OpenGL ES 1.0-2.0,以及WGL、GLX等OpenGL扩展。只要编写xml脚本就能自动生成扩展载入代码。
在王锐的帮助下,glloader完成了移植到Android的工作。目前glloader可以用NDK r6和r7进行编译,在模拟器和真机Xoom上均测试通过。目前,支持Android的glloader代码可以在hg上找到。正式版本glloader 4.0将会在晚些时候发布。
这里有一个在Android NDK中使用glloader的例子,从NDK自带的native-activity修改而来。从这里可以看出,从原先的直接调用GLES改为使用glloader之需要修改#include和link选项。
native-activity.7z
需要注意的是,由于NDK r6的一个bug,所以使用到glloader的shared library都得是C++写的,不能是C,否则会因为连接不到stdc++ runtime而出现连接错误。
posted @ 2011-12-08 11:52 龚敏敏 阅读(1121) 评论(0)
编辑

2011年12月2日
摘要: 转载请注明出处为KlayGE游戏引擎上一篇分析了KlayGE中实现实时全动态GI的方法,本篇是这个系列的完结篇,主要讲流水线的最后一段:Post process。Post process在KlayGE 4.0的Deferred Rendering中,post process主要有HDR、AA和color grading。下面将分别讲述它们的改进。HDR在KlayGE 3.12用了filmic tonemapping之后,HDR部分就几乎没有别的改变。这里唯一的变化是最终输出的float4,把亮度存在A通道上。这是为了后面FXAA的需要。AA在Deferred框架中,无法使用硬件AA曾经是个恼人
阅读全文
posted @ 2011-12-02 11:22 龚敏敏 阅读(1265) 评论(0)
编辑