Deferred Shader测试,OpenGL & DirectX兼容实现,在Geforce6150上仍有问题.
实现注意点:
1.Nvidia的GL_NV_float_buffer扩展,使用GL_FLOAT_RGBA32_NV格式创建浮点纹理,必须配合GL_TEXTURE_RECTANGLE_NV纹理目标,不能使用GL_TEXTURE_2D纹理目标.
2.ATI的GL_ATI_texture_float扩展,使用GL_RGBA_FLOAT32_ATI格式创建浮点纹理,没有上述限制,只需使用一般的GL_TEXTURE_2D目标.
3.幸运的是Nvidia支持ATI的GL_ATI_texture_float扩展,然后发现还有个GL_RGBA32F_ARB == GL_RGBA_FLOAT32_ATI,所以正确的兼容的方案应该使用GL_ARB_texture_float扩展.
4.32浮点纹理不支持纹理过滤,必须将纹理过滤方式设置为GL_NEAREST,否则有可能使用软件模拟运行,速度奇慢无比.
5.起初使用float pack_2half(float2 v)来实现几何数据压缩,以能够存储顶点坐标和法线到FBO的纹理,pack_2half是PK2H指令的cg版本,NVidia的glsl也支持该指令,只是编译有warning,但ATI不支持该指令,编译报错,无法兼容,故转向使用GL_ARB_draw_buffers扩展.
6.GL_ARB_draw_buffers对应的OpenGL shader输出为gl_FragData[]数组,DirectX为COLOR0,COLOR1标识.
7.FBO + float texture,使用32位纹理时,7950GT奇慢无比,改用16位浮点后正常,原因未知.
8.DirectX下使用Float texture render target完成.
9.DirectX实现下,7950GT的显卡最新驱动169.21竟然不支持Float texture render target,CheckDeviceFormat失败,晕倒.
10.Geforce 6150下OpenGL模式跑的很慢,DirectX模式CheckDeviceFormat成功,但有问题.
http://www.cnitblog.com/Files/linghuye/DeferShaderDemo.rar