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

KlayGE走上OSX的实验中,我提到了目前OSX的版本还有两个主要问题,一是没法打开post processing,而是shader编译用的是Cg,以至于不能支持GL3+的功能。钱康来这几天又做了一些实验,在很大程度上解决了这些问题。

Post processing

原先一打开HDR、FXAA、Gamma校正等流水线末端的post processing之后,只能看到黑屏或一片混乱。在xcode的调试中看到的是,back buffer中有正确的结果,但swap到front buffer就只有错误的画面。这就排出了是depth或stencil没用清空造成的错误,只能是swap的地方有什么蹊跷。

经过一番尝试和查阅资料,发现了OSX和其他平台在swap上有所不同。Windows上的SwapBuffers,以及Linux上的glXSwapBuffers,都可以通过参数告诉它应该swap什么。而OSX上的[[view openGLContext] flushBuffer]没有参数,它的行为是吧当前绑定的fbo给swap一下。而如果有post processing,在swap的时候,绑定的fbo不是0,也就没有back和front,所以swap啥都没做,同时front buffer内容错误。解决方式是,先强制bind一下fbo 0,再调用flushBuffer,然后恢复原有fbo,就行了。虽然比较冗长,性能也有点影响,但能解决问题。

如果哪位朋友知道有什么方法比这还好,请赐教。

Shader编译

在Windows上,OpenGL的shader编译是通过D3D编译器,把HLSL编译成DXBC字节码,再通过DXBC2GLSL转成GLSL。而OSX(以及Linux)上并没有D3D编译器,所以会切换到使用Cg做HLSL->GLSL的工作。维护两条流水线的工作量不小,而且Cg流水线的性能和功能都低于DXBC2GLSL的流水线。所以如果能让D3D编译器在OSX和Linux上跑起来,就都能统一用一条流水线。

在这方面,Wine是一条可能走的路。钱康来经过一系列的实验,终于解决了这个问题。目前可以在OSX上调用Windows原生的d3dcompiler_47.dll来编译HLSL。这部分代码还没有合并入KlayGE,将在未来的版本中出现。

其他问题

有了上面两个修正,绝大部分渲染问题已经得到解决。目前还有一个vbo绑定错误的bug正在调查中。相信很快我们就能看到一个100%通过测试的KlayGE for OSX。