转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3271

经过越来越多的测试,在Windows上DXBC2GLSL已经可以取代Cg成为主要的shader编译工具了。由于DXBC2GLSL需要用d3dcompiler把HLSL编译成DXBC,在非Windows上,原先就只能仍然使用Cg来做HLSL到GLSL的转换。

后Cg时代

且不说Cg那差的要死的GLSL支持度,不久前NVIDIA宣布停止Cg的开发和维护,继续用Cg肯定不是个办法。那么在非Windows上编译HLSL就有几个选择:

  1. 开发一个自己的跨平台HLSL编译器。
  2. 用wine的HLSL编译器。
  3. 用wine载入d3dcompiler。

UE4用了第一个选择,但它需要花费的时间精力实在太大了,对于KlayGE来说不合算。第二个选择按说是最佳方法。Wine致力于实现可以在Linux上执行Windows原生程序的抽象层,其中包含了d3dcompiler。但经过钱康来的测试,发现那根本只是一些空函数啊,基本上完全没有实现代码。现在就剩下最后一个选择了。幸运的是,虽然道路有些曲折,但前途还是光明的。用32位的wine可以载入原生的Windows d3dcompiler_47.dll,并用它来编译。后来我们完成了一个独立的工具,用来调用d3dcompiler完成HLSL编译的工作。这个工具可以通过wine执行,所以就解决了在非Windows平台上,已经可以完全没有必要用Cg了。细节请见这里。相对于UE4那样在Windows上用d3dcompiler,其他平台用自己实现的编译器来说,KlayGE已经更前进一步,在所有平台都用同样的d3dcompiler进行编译。稳定性和生成的代码质量都有保证。目前Cg还存在于KlayGE的代码库中,但他很快就会被删除。

另外提一下iOS、Android、WinRT这样的执行平台。在这些平台上,不能也不需要调用shader编译的过程,而需要在相应的开发平台上用FXMLJIT离线编译后部署到执行平台的安装包中。

额外步骤

另外,在非Windows上使用d3dcompiler,还需要有些注意事项。

Linux平台

这里以Ubuntu为例。首先需要安装wine和相关依赖库。

sudo apt-get install wine wine-dev libc6-dev-i386 g++-4.8-multilib libx11-dev libgl1-mesa-dev libglu1-mesa-dev libopenal-dev build-essential

有了wine之后,还需要强制wine进入32位模式,因为64位的wine基本没法工作。

export WINEARCH=win32
winetricks

OSX平台

OSX也需要先安装wine。

brew install wine

接着也需要运行winetricks。

winetricks

有了这些设置之后,KlayGE里的FXMLJIT就能离线编译所有shader。