DirextX 为啥画不出来三角形?

ziyaziya05 2013-04-17 11:31:14
使用D3DFVF_XYZ加上,世界变换等,就是画不出来三角形,因为刚接触DirectX不久,
请各位帮帮忙,本人用的是DirectX9.0、VS2008开发,编译无错误,运行后,一片黑漆漆,没有三角形。。。

代码如下:

#include "windows.h"
#include <d3d9.h>
#include <d3dx9.h>

#define WINDOW_WIDTH 1024
#define WINDOW_HEIGHT 768
#define WINDOW_CLSNAME L"PlayThePlane" //主窗口类名
#define SAFE_RELEASE(p){if(p){(p)->Release();(p)==NULL;}}
#define SAFE_DELETE(p){if(p){delete p;p=NULL;}}

//背景顶点格式
struct BACKVERTEX
{
float x,y,z;
float u,v;
};
#define D3DFVF_BACKVERTEX D3DFVF_XYZ|D3DFVF_TEX1

HWND hwnd=NULL; //主窗体句柄
LPDIRECT3DDEVICE9 g_pd3dDevice; //DirectX3D设备指针

LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer; //顶点缓存对象 用于绘制精灵
LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer; //索引缓存对象 用于绘制精灵
LPDIRECT3DTEXTURE9 g_pTexture; //纹理接口对象 用于绘制精灵

DWORD tPre,tNow; //用于帧频控制


//消息处理函数声明
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);

bool RegisterWindow(HINSTANCE hInstance); //注册窗体类函数声明
HRESULT InitD3D(); //初始化DirectX函数声明
HRESULT InitObject();
void Render(); //渲染函数声明
void Clear(HINSTANCE hInstance); //清理资源函数声明

//主函数
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
if(!RegisterWindow(hInstance))
return -1;

hwnd=CreateWindow(WINDOW_CLSNAME,L"炮打大飞机",
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,
WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);

if(hwnd==NULL)
return -1;

MoveWindow(hwnd,100,100,WINDOW_WIDTH,WINDOW_HEIGHT,true);
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);

if(InitD3D()!=S_OK)
return -1;


MSG msg={0};
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
tNow=GetTickCount();

if(tNow-tPre>30)
{
Render();
}
}
}

Clear(hInstance);

return 0;
}

//注册窗体类函数定义
bool RegisterWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass={0};
wndClass.cbSize =sizeof(WNDCLASSEX);
wndClass.style =CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =0;
wndClass.hIconSm =0;
wndClass.hInstance =hInstance;
wndClass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=WINDOW_CLSNAME;

if(!RegisterClassEx(&wndClass))
return false;

return true;
}

//消息处理函数定义
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_KEYDOWN:
if(wParam==VK_ESCAPE)
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hwnd,message,wParam,lParam);
}

return 0;
}
//初始化DirectX函数定义
HRESULT InitD3D()
{
LPDIRECT3D9 pD3D=NULL;
if(NULL==(pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;

D3DCAPS9 caps;
int vp=0;

if(FAILED(pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)))
return E_FAIL;

if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp=D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp=D3DCREATE_SOFTWARE_VERTEXPROCESSING;

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth = WINDOW_WIDTH;
d3dpp.BackBufferHeight = WINDOW_HEIGHT;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil= true;
d3dpp.AutoDepthStencilFormat= D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz= 0;
d3dpp.PresentationInterval= D3DPRESENT_INTERVAL_IMMEDIATE;

if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,hwnd,vp,&d3dpp,&g_pd3dDevice)))
return E_FAIL;


InitObject();

SAFE_RELEASE(pD3D);

return S_OK;
}
HRESULT InitObject()
{
//创建顶点缓存
if( FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(BACKVERTEX),
0, D3DFVF_BACKVERTEX,
D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL ) ) )
{
return E_FAIL;
}

// 创建索引缓存
if( FAILED(g_pd3dDevice->CreateIndexBuffer(3*sizeof(WORD), 0,
D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)) )
{
return E_FAIL;
}

//以下为设置顶点数据
BACKVERTEX Vertices[4];
Vertices[0].x=-1.0f;
Vertices[0].y=0.0f;
Vertices[0].z=0.0f;
//Vertices[0].rhw=1.0f;
Vertices[0].u=0.0f;
Vertices[0].v=0.0f;

Vertices[1].x=0.0f;
Vertices[1].y=1.0f;
Vertices[1].z=0.0f;
//Vertices[1].rhw=1.0f;
Vertices[1].u=1.0f;
Vertices[1].v=0.0f;

Vertices[2].x=1.0f;
Vertices[2].y=0.0f;
Vertices[2].z=0.0f;
//Vertices[2].rhw=1.0f;
Vertices[2].u=0.0f;
Vertices[2].v=1.0f;

//Vertices[3].x=1.0f;
//Vertices[3].y=1.0f;
//Vertices[3].z=1.0f;
// //Vertices[3].rhw=1.0f;
//Vertices[3].u=1.0f;
//Vertices[3].v=1.0f;

VOID* pVertices;
if(FAILED(g_pVertexBuffer->Lock(0,sizeof(Vertices),(void**)&pVertices,0)))
return E_FAIL;
memcpy(pVertices,Vertices,sizeof(Vertices));
g_pVertexBuffer->Unlock();

//填充索引缓存
WORD Indices[]={0,1,2};

WORD* pIndices=NULL;
if(FAILED(g_pIndexBuffer->Lock(0,0,(void**)&pIndices,0)))
return E_FAIL;
memcpy(pIndices,Indices,sizeof(Indices));
g_pIndexBuffer->Unlock();

D3DXCreateTextureFromFile(g_pd3dDevice,L"plane.jpg",&g_pTexture); //创建纹理

return S_OK;
}
//渲染函数定义
void Render()
{
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
g_pd3dDevice->BeginScene();


D3DXMATRIX matWorld,matScaling, matLook,matProj;

D3DXMatrixTranslation(&matWorld,30.0f,30.0f,0.0f);

D3DXMatrixScaling(&matScaling,32.0f,32.0f,0.0f);
matWorld=matWorld*matScaling;

D3DXMatrixPerspectiveFovLH(&matProj,3.14*0.5f,800.0f/600.0f,1.0f,1000.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);

g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);

D3DXVECTOR3 position(0.0f,0.0f,-10.0f);
D3DXVECTOR3 targetPoint(0.0f,0.0f,0.0f);
D3DXVECTOR3 worldUp(0.0f,1.0f,0.0f);

D3DXMatrixLookAtLH(&matLook,&position,&targetPoint,&worldUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matLook);

g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);

g_pd3dDevice->SetStreamSource(0,g_pVertexBuffer,0,sizeof(BACKVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_BACKVERTEX);
g_pd3dDevice->SetIndices(g_pIndexBuffer);
g_pd3dDevice->SetTexture(0,g_pTexture);


g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,3,0,1);



g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
tPre=GetTickCount();
}
//清理资源函数定义
void Clear(HINSTANCE hInstance)
{
UnregisterClass(WINDOW_CLSNAME,hInstance);
SAFE_RELEASE(g_pd3dDevice);
}
...全文
138 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
anmychen2001 2013-05-09
  • 打赏
  • 举报
回复
看了下你的BACKVERTEX,确实只有纹理信息,没有法向信息。
ziyaziya05 2013-04-24
  • 打赏
  • 举报
回复
原来是我没有写关闭光照,加上了之后就可以了,虽然还是不懂为什么。。。
zyq5945 2013-04-17
  • 打赏
  • 举报
回复
DirectX Sample Browser中有例子的。
anmychen2001 2013-04-17
  • 打赏
  • 举报
回复
一般无非以下几点, 1:法向量的问题,单面显示,法向量反了,根据你的视点设置,选择左手系还是右手系的法向取法。 2:限定盒太小 3:视点不正确,举个例子比如你的东西画在A处,但你看在B处当然看不到。

19,472

社区成员

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

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