为什么我只能画半个图形?

jybqq1982 2009-01-06 01:31:47
我写了一个程序,目标是在窗口上画一个正方形,但效果却是,用DrawPrimitive()只画出了第一个三角形,用索引的话什么也画不出来,请教高手们我在哪里错了?
全部代码如下:
#include <windows.h>
#include <d3dx9.h>
////////////////
//Globals
const int Width=640;
const int Height=480;
IDirect3D9* d3d9=NULL;
IDirect3DDevice9* Device=NULL;
IDirect3DVertexBuffer9* VB=NULL;
IDirect3DIndexBuffer9* IB=NULL;
////////////////
// Structs or Classes
struct Vertex //定义顶点结构
{
Vertex(){}
Vertex(float x,float y,float z)
{
_x=x;
_y=y;
_z=z;
}
float _x,_y,_z;
const static DWORD FVF;
};
const DWORD Vertex::FVF=D3DFVF_XYZ;
////////////////
//Frame work Function
//初始化3D
BOOL Init3D(HWND hwnd,bool windowed,D3DDEVTYPE DeviceType,
int width,int height,IDirect3DDevice9** pDevice)
{
d3d9=Direct3DCreate9(D3D_SDK_VERSION);
if(!d3d9)
{
MessageBox(NULL,"Direct3DCreate9() FAILED!",0,0);
return false;
}
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,DeviceType,&caps);
int vp=0;
if(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;

D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth=width;
d3dpp.BackBufferHeight=height;
d3dpp.BackBufferFormat=D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount=0;
d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality=0;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hwnd;
d3dpp.Windowed=windowed;
d3dpp.EnableAutoDepthStencil=true;
d3dpp.AutoDepthStencilFormat=D3DFMT_D24S8;
d3dpp.Flags=0;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;

HRESULT hr;
hr=d3d9->CreateDevice(D3DADAPTER_DEFAULT,
DeviceType,
hwnd,
vp,
&d3dpp,
pDevice);
if(FAILED(hr))
{
d3d9->Release();
MessageBox(NULL,"CreateDevice() FAILED!",0,0);
return false;
}
return true;
}
//创建资源
BOOL Setup()
{
HRESULT hr;
hr=Device->CreateVertexBuffer(
4*sizeof(Vertex),
D3DUSAGE_WRITEONLY,
Vertex::FVF,
D3DPOOL_MANAGED,
&VB,
NULL);
if(FAILED(hr))
{
MessageBox(NULL,"CreateVertexBuffer() FAILED!",0,0);
return false;
}

Vertex* pVB=NULL;
VB->Lock(0,0,(void**)&pVB,0);
pVB[0]=Vertex(-1.0f,-1.0f,-1.0f);
pVB[1]=Vertex(-1.0f,1.0f,-1.0f);
pVB[2]=Vertex(1.0f,1.0f,-1.0f);
pVB[3]=Vertex(1.0f,-1.0f,-1.0f);

VB->Unlock();

DWORD* pIB=NULL;
hr=Device->CreateIndexBuffer(6*sizeof(DWORD),D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,D3DPOOL_MANAGED,&IB,0);
if(FAILED(hr))
{
MessageBox(NULL,"CreateIndexBuffer() FAILED!",0,0);
return false;
}
IB->Lock(0,0,(void**)&pIB,0);
pIB[0]=0; pIB[1]=1; pIB[2]=2;
pIB[3]=0; pIB[4]=2; pIB[5]=3;
IB->Unlock();
//Set Camera
D3DXMATRIX view;
D3DXVECTOR3 position(0.0f,0.0f,-4.0f);
D3DXVECTOR3 aim(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&view,&position,&aim,&up);
Device->SetTransform(D3DTS_VIEW,&view);
//Set Projection
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI*0.5f,
(float)Width/(float)Height,
1.0f,
100.0f);
Device->SetTransform(D3DTS_PROJECTION,&proj);

Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
return true;
}
//释放资源
void Clean()
{
if(VB)
VB->Release();
if(IB)
IB->Release();
if(Device)
Device->Release();
if(d3d9)
d3d9->Release();
}
//显示效果,这里timeDelay不起作用,是为其它程序用的
void Display(float timeDelay)
{
if(Device)
{
Device->Clear(0,NULL,D3DCLEAR_STENCIL | D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
0xffffffff,1.0f,0);
Device->BeginScene();
Device->SetStreamSource(0,VB,0,sizeof(Vertex));
//Device->SetIndices(IB);
Device->SetFVF(Vertex::FVF);
Device->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);

//Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2);
Device->EndScene();
Device->Present(0,0,0,0);
}
}
//消息循环
void MsgLoop()
{
MSG msg;
ZeroMemory(&msg,sizeof(msg));
static float lastTime=(float)timeGetTime();
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
float currTime=(float)timeGetTime();
float timeDelay=currTime-lastTime;
Display(timeDelay);
lastTime=currTime;

}
}
}
///////////////
// Window Proc
LRESULT CALLBACK WinProc(
HWND hwnd, // handle to window
UINT Msg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(Msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd,Msg,wParam,lParam);
}
///////////////
// WinMain
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
HWND hwnd;
WNDCLASS cs;

cs.cbClsExtra=0;
cs.cbWndExtra=0;
cs.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
cs.hCursor=LoadCursor(NULL,IDC_ARROW);
cs.hIcon=LoadIcon(NULL,IDI_APPLICATION);
cs.hInstance=hInstance;
cs.lpfnWndProc=WinProc;
cs.lpszClassName="DirectX";
cs.lpszMenuName=NULL;
cs.style=CS_HREDRAW | CS_VREDRAW;

if(!RegisterClass(&cs))
{
MessageBox(NULL,"RegisterClass()--Fail!","ERROR",MB_OK);
return 0;
}

hwnd=CreateWindow("DirectX","DirectX",WS_OVERLAPPEDWINDOW | WS_EX_TOPMOST,
CW_USEDEFAULT,CW_USEDEFAULT,Width,Height,NULL,NULL,hInstance,NULL);
if(!hwnd)
{
MessageBox(NULL,"CreateWindow()--Fail!","ERROR",MB_OK);
return 0;
}
SetWindowLong(hwnd,GWL_STYLE,GetWindowLong(hwnd,GWL_STYLE)&~(WS_MAXIMIZEBOX | WS_THICKFRAME));

if(!Init3D(hwnd,TRUE,D3DDEVTYPE_HAL,Width,Height,&Device))
{
MessageBox(NULL,"Init3D()--FAILED!",0,0);
}
if(!Setup())
{
MessageBox(NULL,"Setup() --FAILED!",0,0);
}

ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);


MsgLoop();



Clean();
return 0;
}
...全文
108 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jybqq1982 2009-01-06
  • 打赏
  • 举报
回复
自己解决了,原来是索引类型写错了
fandh 2009-01-06
  • 打赏
  • 举报
回复
代码太长了,只能帮顶了

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧