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相关错误
-
dxerr9.h无法找到?
答:SDK August 2009 之后没有 dxerr9.h 了,只有 dxerr.h。
所有包含Dxerr9.h的地方替换为Dxerr.h;
将所有使用 DXGetErrorDescription9 的地方替换 DXGetErrorDescription;
连接器设置中使用dxerr9.lib 的地方替换dxerr.lib。
-
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的中心
6. shader浮点精度问题
假设一个attribute或uniform变量(例如fSize),是由CPU端将整型变量强转成浮点型的(例如(float)5)。那么在shader中 fSize < 5.0 将是未定值。
解决方法是在CPU中改为 fSize= (float)5 + 0.000001f;