展开异次空间

:: 相对折叠空间/讨论游戏/软件设计.技术 ::

 

D3D / OpenGL 常见错误以及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是异步的.

待续...

posted on 2008-04-10 12:36 Updraft Studio 阅读(1647) 评论(0)  编辑 收藏 引用

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

导航

统计

公告

激情,努力

常用链接

留言簿(9)

随笔档案(53)

文章档案(25)

@Updraft Studio@

搜索

最新评论

阅读排行榜

评论排行榜

Freelance Jobs