求助纠结几天了~~懂directx9.0c的高人帮帮忙吧....

Leric_Lee 2012-08-07 11:10:22
#include<d3dx9.h>
#include<windows.h>

HWND hWnd;
LPDIRECT3D9 g_pd3d = NULL;
LPDIRECT3DDEVICE9 g_pd3ddevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_VB = NULL;
LPDIRECT3DINDEXBUFFER9 g_IB = NULL;



struct CUSTOMVERTEX
{
CUSTOMVERTEX(){};
CUSTOMVERTEX(float q, float w, float e)
{
x = q;
y = w;
z = w;
r = 1.0f;
color = 0xffff0000;
};
float x,y,z,r;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

HRESULT InitD3D(HWND hWnd)
{
if(FAILED(g_pd3d = Direct3DCreate9(D3D_SDK_VERSION)))
{
MessageBox(NULL, L"FUCK", NULL, MB_OK);
return E_FAIL;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

if(FAILED(g_pd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3ddevice ) ) )
{
MessageBox(NULL, L"FUCK", NULL, MB_OK);
return E_FAIL;
}
//g_pd3ddevice->SetRenderState(D3DRS_LIGHTING, FALSE);
return S_OK;
}

HRESULT InitVbIb()
{
CUSTOMVERTEX vertex[4];
vertex[0] = CUSTOMVERTEX(1.0f, 1.0f, 1.0f);
vertex[1] = CUSTOMVERTEX(1.0f, -1.0f, 1.0f);
vertex[2] = CUSTOMVERTEX(-1.0f, 1.0f, 1.0f);
vertex[3] = CUSTOMVERTEX(-1.0f, -1.0f, 1.0f);

WORD Index[6] = {0, 1, 2, 1,3,2};

if(FAILED(g_pd3ddevice->CreateVertexBuffer(4*sizeof(CUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX,
D3DPOOL_MANAGED, &g_VB, NULL)))
{
MessageBox(NULL, L"FUCK", NULL, MB_OK);
return E_FAIL;
}
CUSTOMVERTEX* Pvertex;
//ZeroMemory(Pvertex, sizeof(Pvertex));
if(FAILED(g_VB->Lock(0, 0, (void**)&Pvertex, 0)))
{
return E_FAIL;
}
memcpy(Pvertex, vertex, sizeof(vertex));
g_VB->Unlock();

if(FAILED(g_pd3ddevice->CreateIndexBuffer(6*sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT,
&g_IB, NULL)))
return E_FAIL;

WORD* Pindex;
//ZeroMemory(Pindex, sizeof(Pindex));
if(FAILED(g_IB->Lock(0, 0, (void**)&Pindex, 0)))
return E_FAIL;
memcpy(Pindex, Index, sizeof(Index));
g_VB->Unlock();

return S_OK;
}
void Render()
{
g_pd3ddevice->Clear(0,0, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255), 1.0f, 0);
if(SUCCEEDED(g_pd3ddevice->BeginScene()))
{
g_pd3ddevice->SetStreamSource(0, g_VB, 0, sizeof(CUSTOMVERTEX));
g_pd3ddevice->SetIndices(g_IB);
g_pd3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3ddevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);

g_pd3ddevice->EndScene();
}

}

void Clean()
{
g_VB->Release();
g_IB->Release();
g_pd3ddevice->Release();
g_pd3d->Release();
}

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Clean();
PostQuitMessage(0);
break;
};
return DefWindowProc(hWnd, msg, wParam, lParam);
}

INT WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE PrehInstance, LPSTR szCmdLine, int nCmdShow)
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC , WndProc, 0, 0,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
L"ClassName", NULL };
RegisterClassEx( &wc );

//创建窗口
hWnd = CreateWindow( L"ClassName", L"坐标变换",
WS_OVERLAPPEDWINDOW, 200, 100, 500,500,
GetDesktopWindow(), NULL, wc.hInstance, NULL );

ShowWindow( hWnd, SW_SHOW );
UpdateWindow( hWnd );

//初始化Direct3D
InitD3D( hWnd );
InitVbIb();

////创建场景图形
// if( SUCCEEDED( InitGeometry() ) )
// {
// //显示窗口


//进入消息循环
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( true )
{
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render(); //渲染图形
}
}

return 0;
}

运行程序崩溃,窗口是建出来了,但是render()部分代码没有被执行...
中断之后编译器说我的device里的_vfptr错误,但是逐行调试的时候就没出现这种问题.....求救啊.....
...全文
180 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yofoo 2012-08-13
  • 打赏
  • 举报
回复
1. Render加一句
g_pd3ddevice->Present( NULL, NULL, NULL, NULL );
2. 定点数据不对(太小), 换个
vertex[0] = CUSTOMVERTEX(100.0f, 400.0f, 1.0f);
vertex[1] = CUSTOMVERTEX(200.0f, 200.0f, 1.0f);
vertex[2] = CUSTOMVERTEX(400.0f, 200.0f, 1.0f);
vertex[3] = CUSTOMVERTEX(400.0f, 100.0f, 1.0f);
3. 退出要判断WM_QUIT, 导致逻辑不对, 释放后再使用就异常
Leric_Lee 2012-08-07
  • 打赏
  • 举报
回复
补充下...编译器是vs2010,win7 32位平台....
Leric_Lee 2012-08-07
  • 打赏
  • 举报
回复
render()第一句刷新是出了效果的,程序背景颜色都刷出来了,但是if里面的两个三角形没画出来,关闭程序就崩溃;我把if部分注释了也是这样,背景刷出来,关闭就崩溃
Leric_Lee 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
先编译和运行DirectX自带的例子看看有错误不。
[/Quote]
我这sdk找不到dx9的例子...只有dx10 11的,应该不是sdk的问题,我以前用过是可以的。
我把render()里面的语句都分别注释尝试过,都是同样问题程序崩溃,但是设备初始化和填充顶点索引那部分
带device的语句就没事....好纠结啊....为什么直接编译运行的时候变量的值和逐行运行时的值会有不同.而且只出现在render里面...
zyq5945 2012-08-07
  • 打赏
  • 举报
回复
先编译和运行DirectX自带的例子看看有错误不。

19,468

社区成员

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

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