GPU编程常见错误

1、D3DXCompileShaderFromFile编译shader文件时,提示E_Fail(shader文件确定无错)

 

答:可能是因为新版本的SDK默认使用DX10的HLSL编辑器引擎的问题,如果是这种情况,只要在调用D3DXCreateEffectFromFile时 的flag参数里面加上3DXSHADER_USE_LEGACY_D3DX9_31_DLL这个值就可以了。

DX SDK的文档里面有说的,在D3DXSHADER Flags这个主题里面。
不过说的很隐晦,要两个地方结合起来看:
1)D3DXCreateEffectFromFile 函数对Flags参数的描述里面说了这么一句:
The Direct3D 10 HLSL compiler is now the default
也就是说默认使用D3D10的HLSL编译器
2)D3DXSHADER Flags对D3DXSHADER_USE_LEGACY_D3DX9_31_DLL的描述里面有这么一句:
Enable the use of the original Direct3D 9 HLSL compiler.
也就是说加入这个值以后就使用D3D9的HLSL编译器了。

 

2、渲染一个模型时,屏幕上未显示的原因有:

模型不在相机视锥内(分为CPU裁剪和GPU裁剪两部分);

DepthBuffer未清空,导致被遮蔽;

FrameBufferObject不是场景帧缓存;

模型的AlphaMap存在FrameBufferObject中,但绘制前其他位置执行clearBuffer了

不在可视 viewPort 内(glViewPort);

 

3、PointSprite在ATI显卡和NVIDIA显卡上的区别

opengl默认gl_pointcoord是从左到右,从上到下(GL_POINT_SPRITE_COORD_ORIGIN默认为GL_UPPER_LEFT,不是GL_LOWER_LEFT).

但ATI的实现可能有些bug,要具体测试,且ATI的sprite的裁剪是以顶点中心位置决定的,若中心位置不在屏幕中,则整个sprite不进行绘制

(可能原因:ATi渲染到非屏幕FrameBuffer是从下往上绘制,而渲染到屏幕FrameBuffer则自上而下,后一种也是NVIDIA显卡默认采取的方式。此种情况可通过翻转gl_pointcoord的y坐标来更正)

 

4、DXUT相关错误
  1. dxerr9.h无法找到?

    答:SDK August 2009 之后没有 dxerr9.h 了,只有 dxerr.h。

    所有包含Dxerr9.h的地方替换为Dxerr.h;

    将所有使用 DXGetErrorDescription9 的地方替换 DXGetErrorDescription;

    连接器设置中使用dxerr9.lib 的地方替换dxerr.lib。

     

  2. DxutSound.h中有关IDirectSound8未声明的错误

    答:在DXUTSound.h中,将“IDirectSound8* m_pDS”改为“ IDirectSound* m_pDS”;同样将“ inline  LPDIRECTSOUND8 GetDirectSound() { return m_pDS; } ” 改为“ inline  LPDIRECTSOUND GetDirectSound() { return m_pDS; }“.

    在DXUTSound.cpp中,将” hr = Direct”SoundCreate8( NULL, &m_pDS, NULL )“ 改为“ hr = DirectSoundCreate( NULL, &m_pDS, NULL )”.

 

5.忘记texel/pixel的取值是在cell的中心
比如:如果将lookup表变成纹理,则查询的时候应该是tex1D(s0, (index + 0.5) / TextureSize);

 

6. shader浮点精度问题

假设一个attribute或uniform变量(例如fSize),是由CPU端将整型变量强转成浮点型的(例如(float)5)。那么在shader中 fSize < 5.0 将是未定值。

解决方法是在CPU中改为 fSize= (float)5 + 0.000001f;

转载于:https://www.cnblogs.com/ActionFG/archive/2012/09/09/2677805.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值