|
本人DX9的初学者,之前都是照着书抄的代码,然后为了试着深入学习,所以写了一个简单的框架,想自己不看书写代码看看效果,框架没有问题。最近写了一个简单的贴图程序,顶点坐标和摄像机坐标都是先照着书上的写的,程序能得到我想要的效果,但之后我稍微改了一下顶点坐标和摄像机坐标后就发现什么也没有了。
下面是主要的问题代码,请大大们帮忙看看问题出在哪儿:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
CMainD3D d3d(hInstance, showCmd, WIDTH, HEIGHT);
//////////////////////////////SETUP////////////////////////////////
d3d.CreateVertexBuffer(6*VERTEXSIZE, VERTEXFVF);
SVertex* v;
d3d.LockVertexBuffer((void**)&v);
// 书上的顶点坐标 fvf = xyz | normal | tex1
v[0] = SVertex(-5.0f, 5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
v[1] = SVertex(5.0f, 5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
v[2] = SVertex(5.0f, -5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);
v[3] = v[2];
v[4] = SVertex(-5.0f, -5.0f, 3.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
v[5] = v[0];
d3d.UnlockVertexBuffer();
using namespace nsColorSet;
d3d.SetDirectLight(ColorWhite*0.5f, ColorWhite, ColorWhite*0.3f, D3DXVECTOR3(0.0f, 0.0f, 1.0f));
d3d.GetDevice()->LightEnable(0, true);
// 书上的摄像机坐标 从(0,0,-6)看向(0,0,0)
d3d.SetCamera(D3DXVECTOR3(0.0f, 0.0f, -6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DX_PI*0.5f, float(WIDTH/HEIGHT));
d3d.SetTexture("CD.jpg");
d3d.GetDevice()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
d3d.SetMaterial(ColorWhite, ColorWhite, ColorWhite, ColorBlack, 2.0f);
/////////////////////////////STARTUP//////////////////////////////
float fStart = (float)::GetTickCount();
return d3d.StartProc(&fStart);
}
运行结果正常:一个带纹理的正方形在屏幕中央
之后稍微改了下顶点坐标,灯光方向和摄像机坐标后的代码:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
CMainD3D d3d(hInstance, showCmd, WIDTH, HEIGHT);
//////////////////////////////SETUP////////////////////////////////
d3d.CreateVertexBuffer(6*VERTEXSIZE, VERTEXFVF);
SVertex* v;
d3d.LockVertexBuffer((void**)&v);
// 之前正方形垂直于z=3,现在垂直于z=-3,法向量反向
v[0] = SVertex(-5.0f, 5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
v[1] = SVertex(5.0f, 5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);
v[2] = SVertex(5.0f, -5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
v[3] = v[2];
v[4] = SVertex(-5.0f, -5.0f, -3.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f);
v[5] = v[0];
d3d.UnlockVertexBuffer();
using namespace nsColorSet;
// 灯光反向
d3d.SetDirectLight(ColorWhite*0.5f, ColorWhite, ColorWhite*0.3f, D3DXVECTOR3(0.0f, 0.0f, -1.0f));
d3d.GetDevice()->LightEnable(0, true);
// 摄像机从(0,0,6)看向(0,0,0)
d3d.SetCamera(D3DXVECTOR3(0.0f, 0.0f, 6.0f), D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DX_PI*0.5f, float(WIDTH/HEIGHT));
d3d.SetTexture("CD.jpg");
d3d.GetDevice()->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
d3d.SetMaterial(ColorWhite, ColorWhite, ColorWhite, ColorBlack, 2.0f);
/////////////////////////////STARTUP//////////////////////////////
float fStart = (float)::GetTickCount();
return d3d.StartProc(&fStart);
}
运行效果:屏幕上什么也没有。
这没有道理啊,如果是把整个系统都画在纸上完全符合逻辑。请问这问题到底出在哪里,小弟不胜感谢。。
PS:附上工程文件,平台是vs.net 2003,设置了dx包含文件目录为系统目录,并且工程默认链接d3d9.lib d3dx9.lib winmm.lib |
|