随笔-86  评论-84  文章-0  trackbacks-0
  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编译)

 

方案明确后,步骤也就能很快定义出来:

  1. D3D11 bytecode反汇编
  2. VS/PS to GLSL
  3. 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上顺利执行了。

KlayGE Text on Android x86
Text例子。乱码不是bug,只因为系统区域没设置成中文。

 

KlayGE Vertex Displacement on Android x86

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游戏引擎

 

glloaderKlayGE游戏引擎的 一个子项目,是一个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目前可以顺利执行:

KlayGE on Android x86

是的,只有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) 编辑
昵称:龚敏敏
园龄:3年7个月
粉丝:71
关注:5
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

搜索

 
 

常用链接

我的标签

随笔档案

KlayGE

朋友的blog

最新评论

阅读排行榜

评论排行榜

推荐排行榜