平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

Deferred Shader Demo

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

posted on 2008-02-03 22:37 linghuye 阅读(1444) 评论(0)  编辑 收藏 引用 所属分类: 3D图形学研究

只有注册用户登录后才能发表评论。