平民程序 - linghuye's blog

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

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

OpenGL/DirectX高级编程Bug

低级编程错误的根由是粗心造成的,而这里所谓高级编程错误源自各版本驱动程序的Bug和一些不合理的API接口,此类错误通常令人吐血,出现一个都要耗费数小时甚至数天来解决,这是个实际经验累计的过程,痛苦而又必要.

1.要求D3DXCreateTexture创建D3DFMT_A8R8G8B8格式纹理,在某些显卡(MX4000,Intel82815,FX5200)的某些驱动程序环境下,会意外地返回D3DFMT_A4R4G4B4,导致程序写内存错误,系统崩溃,蓝屏报告显卡驱动程序DLL错误,文字呈现白色方块等一系列错误现象.切记,不能相信D3DXCreateTexture.

2.表象上,单句g_D3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, s_vec, sizeof(LineVertex));渲染2D图象,消耗很高,达100-200ws,但实际应为4-10ws,且此消耗值不稳定浮动.将原顶点格式从D3DFVF_XYZRHW | D3DFVF_DIFFUSE改成D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX0后下降至正常的数值,但其他格式的渲染消耗又上升.此渲染状态的切换导致的消耗,非DrawPrimitiveUP之过,只因此句Draw恰逢渲染状态切换.Shader状态变化(SetVertexShader)伴随在谁身上,谁的消耗就最大,该消耗是100ws级的.

3.使用XP远程桌面登录启动D3D游戏时,DirectX设备创建失败.具体原因是,远程登录方式无法使用显卡硬件,在获取显卡硬件设备GetDeviceCaps时错误.

4.SetTexture(stage, NULL)在高端显卡上会关闭该stage的纹理作用,在低端显卡上不会.据MSDN理论上其含义应该等同于设置为一个黑色不透明的纹理,但NVidia显卡遵循OpenGL标准,等同于设置一个全白纹理.有些显卡会自动禁用该纹理层,等同D3DTOP_DISABLE.

5.Nvidia 7950GT上,使用 
glInterleavedArrays(fvf, 0, pVertexPointer);
glDrawElements(primType, primCount, GL_UNSIGNED_SHORT, pIndices);
memset(pVertexPointer, 0, size);
最后一步的数据清空竟然会影响glDrawElements的结果!导致渲染错误.其他显卡无此问题,最新驱动仍未解决此问题,只能使用glXXXPointer来实现兼容.

6.ATI的GLSL其慢无比. X1650XT比Geforce6150高出一代,而同一个GLSL Skinning animation Shader, Geforce 6150跑200多帧,而X1650竟然只跑39帧,用HLSL实现的Shader则可以跑500帧.所以除非ATI对驱动程序作优化,这个问题无法解决.

7.在激活纹理坐标数组模式时,即使启用了自动生成纹理,也需要显示设置glTexCoordPointer为NULL,否则有崩溃的可能.

8.ATI 7500在CreateVertexBuffer时指明顶点FVF,而后在DrawIndexPrimitives时蓝屏崩溃(6.5驱动),改为不指明FVF,即设为0后正常.

9.渲染出的场景全白, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB) 被打开. 

10.OpenGL中压缩纹理作glTexImage2D后马上glGetTexImage,会取不到数据,不稳定. ATI 1650XT 驱动8.1,发现此问题. Nvidia显卡无此问题,似乎glTexImage2D是异步的.

11.在不支持NPOT的机器上,创建非2的幂次方的RenderTarget纹理,使用D3DXCreateTexture,返回的纹理尺寸可能被扩整到2的幂次方大小,此时需要特别注意最后将RenderTarget渲染到屏幕的范围.

12.在RenderTarget上绘图,先ClearBuffer,然后将场景画在RenderTarget上. 最后将RenderTarget以FVF_XYZRHW的格式画一个Quad到屏幕上. 其他显卡均正常,但在ATI 2400XT上只看到ClearBuffer的背景,没看到场景. 更换数款驱动程序无效,最后吐血发现是XYZRHW的w值为0.0会产生此灵异现象,改为1.0后解决. 仅在ATI 2400XT上发现此Bug,其间陆续借用别人机器调整了6个小时,痛苦
.

13.DX8.1同一个游戏程序,频繁启动,关闭,即频繁启动DX,关闭DX。 或者在多个游戏窗口间切换,(可能伴随启动关闭),发生D3DRS_ALPHABLEND状态丢失现象,即原本始终打开的D3DRS_ALPHABLEND,被莫名关闭,原因不明.

posted on 2007-06-12 22:59 linghuye 阅读(2341) 评论(2)  编辑 收藏 引用 所属分类: 3D图形学研究置顶项目

评论

# re: OpenGL/DirectX高级编程Bug  回复  更多评论   

Cool
2007-07-06 10:06 | JackWolf

# re: OpenGL/DirectX高级编程Bug  回复  更多评论   

收藏了~呵呵,从前辈这学到很多啊。
感觉3D游戏和手机游戏有点这个共同处,每种不同的硬件设备都会有一堆头痛的bug,第三方bug最头疼。
2007-09-01 22:02 | 菜菜
只有注册用户登录后才能发表评论。