菜鸟问题, 解决就给分

火猴 2005-01-10 04:43:06
照书写的例子, <Visual C++ OpenGL DirectX 三维动画编程宝典>D3D部分的第一个例子,为什么三角和方块现实不出来啊?
#include <windows.h>
#include <D3DX8.h>
#include <time.h>

HWND hWnd;
HDC hDC;
HINSTANCE hInstance;

LPDIRECT3D8 P_D3D;
LPDIRECT3DDEVICE8 p_D3DDevice;

RECT rect;

int sw=640;
int sh=480;

bool fullscreen = true;

struct my_vertex{
FLOAT x, y, z, rhw;
DWORD color;
};

#define D3D9T_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

my_vertex g_triangle_vertices[]={
{125.0f, 50.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{200.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{50.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF}
};

my_vertex g_square_vertices[]={
{250.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{250.0f, 50.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{400.0f, 200.0f, 0.5f, 1.0f, 0xFFFFFFFF},
{400.0f, 50.0f, 0.5f, 1.0f, 0xFFFFFFFF}
};

//定点缓冲
IDirect3DVertexBuffer8 *g_triangle=NULL;
IDirect3DVertexBuffer8 *g_square=NULL;

#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"d3dx8.lib")

int D3DInit()
{
HRESULT hr;
unsigned char *vb_Vertices;

hr=p_D3DDevice->CreateVertexBuffer(3*sizeof(my_vertex),
D3DUSAGE_WRITEONLY,
D3D9T_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_triangle, NULL);

hr=p_D3DDevice->CreateVertexBuffer(4*sizeof(my_vertex),
D3DUSAGE_WRITEONLY,
D3D9T_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_square, NULL );

hr=g_triangle->Lock(0,0,(void **)&vb_Vertices,0);

memcpy(vb_Vertices,g_triangle_vertices, sizeof(g_triangle_vertices));

g_triangle->Unlock();


hr=g_square->Lock(0,0,(void **)&vb_Vertices,0);

memcpy(vb_Vertices,g_square_vertices, sizeof(g_triangle_vertices));

g_square->Unlock();

return 1;

}

D3DFORMAT find_16bit_mode(void){
HRESULT hr;
hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_R5G6B5, D3DFMT_R5G6B5, false);

if (SUCCEEDED(hr)){
OutputDebugString("D3DFMT_R5G6B5\n");
return D3DFMT_R5G6B5;
}

hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_X1R5G5B5, D3DFMT_X1R5G5B5, false);
if (SUCCEEDED(hr)){
OutputDebugString("D3DFMT_R5G5B5\n");
return D3DFMT_R5G6B5;
}

return (D3DFORMAT)NULL;

}

void D3DEnable(){
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE display_mode;

P_D3D=Direct3DCreate9(D3D_SDK_VERSION-1);
hr=P_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display_mode);

ZeroMemory(&d3dpp, sizeof(d3dpp));

d3dpp.SwapEffect= D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hWnd;
d3dpp.BackBufferCount=1;

if (fullscreen){
d3dpp.Windowed=false;
d3dpp.BackBufferWidth=sw;
d3dpp.BackBufferHeight=sh;
d3dpp.BackBufferFormat=find_16bit_mode();
}
else
{
d3dpp.Windowed=true;
d3dpp.BackBufferFormat=display_mode.Format;
}

hr=P_D3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&p_D3DDevice);

}


void D3DDisable()
{
if (p_D3DDevice){
p_D3DDevice->Release();
p_D3DDevice=NULL;
}

if(P_D3D){
P_D3D->Release();
P_D3D=NULL;
}

if(g_triangle){
g_triangle->Release();
g_triangle=NULL;
}

if(g_square){
g_square->Release();
g_square=NULL;
}
}

void D3DSceneShow()
{
static unsigned char red=0, green=0, blue=0;

srand( (unsigned)(time(NULL)));
red=rand()%255;
green=rand()%255;
blue=rand()%255;

p_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(red,green,blue),1.0f,0);

if (SUCCEEDED(p_D3DDevice->BeginScene())){
p_D3DDevice->SetStreamSource(0,g_triangle,0,sizeof(my_vertex));
p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
p_D3DDevice->SetStreamSource(0,g_square,0,sizeof(my_vertex));
p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);

p_D3DDevice->EndScene();
}

p_D3DDevice->Present(NULL, NULL, NULL, NULL);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
GetWindowRect(hWnd, &rect);
sw=rect.right-rect.left;
sh=rect.bottom-rect.top;
return 0;

case WM_SIZE:
return 0;

case WM_CLOSE:
ShowWindow(hWnd, SW_HIDE);
PostQuitMessage(0);
return 0;

case WM_DESTROY:
return 0;

case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
return 0;

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

int APIENTRY WinMain(HINSTANCE HiNSTANCE, HINSTANCE HpREViNSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
MSG msg;
bool bQuit=false;

if (MessageBox(NULL, "是否选择全屏现实模式?", "全屏方式运行?", MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=0;
}

wc.style=CS_OWNDC;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="Name";
RegisterClass(&wc);

if (fullscreen)
{
hWnd=CreateWindow("Name",
"Lesson1",
WS_POPUP|WS_CLIPSIBLINGS|WS_VISIBLE,
0, 0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL, NULL,
hInstance,
NULL);

}
else
{
hWnd=CreateWindow("Name",
"Lesson1",
WS_TILEDWINDOW|WS_VISIBLE,
GetSystemMetrics(SM_CXSCREEN)/2-sw/2,
GetSystemMetrics(SM_CYSCREEN)/2-sh/2,
sw,sh,
NULL, NULL,
hInstance,
NULL);
ChangeDisplaySettings(NULL, 0);
}
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);

D3DEnable();
D3DInit();

if (!fullscreen)
{
GetWindowRect(hWnd, &rect);
sw=rect.right-rect.left ;
sh=rect.bottom-rect.top;

}

while(!bQuit)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if (msg.message==WM_QUIT)
bQuit=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
D3DSceneShow();
}
}
D3DDisable();
ShowWindow(hWnd, SW_HIDE);
DestroyWindow(hWnd);
ChangeDisplaySettings(NULL, 0);

return msg.wParam ;
return 0;
}

...全文
134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
myling 2005-01-11
  • 打赏
  • 举报
回复
p_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(red,green,blue),1.0f,0);
让我改成
p_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,0,1.0f,0);
myling 2005-01-11
  • 打赏
  • 举报
回复
呵呵,忘记了

随机背景色让我给去掉了

我嫌它晃眼,哈哈
火猴 2005-01-11
  • 打赏
  • 举报
回复
多谢大虾

顺便再问一下, 为什么修改了以后,背景就不会闪动了呢?
myling 2005-01-10
  • 打赏
  • 举报
回复
前面我说的FVF的格式恰好说反了,更正一下
在你这里就要用D3DFVF_XYZRHW,因为你的坐标是屏幕坐标

然后说说你的几个主要错误

1.D8和D9混在一起了,头文件是D8的,里面的几个函数却用的D9的函数格式
这些函数已经变了,参数数目或者类型不一样
就是这几个函数
CreateVertexBuffer和SetStreamSource D9比D8多了一个参数
Lock,D8类型是BYTE** D9是void**


2.也是最主要的
落了这句p_D3DDevice->SetFVF( D3D9T_CUSTOMVERTEX );
没设置格式
myling 2005-01-10
  • 打赏
  • 举报
回复
给你改过来了

#include <windows.h>
#include <D3D9.h>
#include <time.h>

HWND hWnd;
HDC hDC;
HINSTANCE hInstance;

LPDIRECT3D9 P_D3D;
LPDIRECT3DDEVICE9 p_D3DDevice;

RECT rect;

int sw=640;
int sh=480;

bool fullscreen = true;

struct my_vertex{
FLOAT x, y, z,rhw;
DWORD color;
};

#define D3D9T_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

my_vertex g_triangle_vertices[]={
{320.0f, 50.0f, 0.5f, 1.0f,0xFFFFFFFF},
{250.0f, 400.0f, 0.5f, 1.0f,0xFFFFFFFF},
{50.0f, 400.0f, 0.5f, 1.0f,0xFFFFFFFF},
};

my_vertex g_square_vertices[]={
{250.0f, 200.0f, 0.5f,1.0f, 0xFFFFFFFF},
{250.0f, 50.0f, 0.5f,1.0f, 0xFFFFFFFF},
{400.0f, 200.0f, 0.5f,1.0f, 0xFFFFFFFF},
{400.0f, 50.0f, 0.5f,1.0f, 0xFFFFFFFF}
};

//定点缓冲
IDirect3DVertexBuffer9 *g_triangle=NULL;
IDirect3DVertexBuffer9 *g_square=NULL;

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

int D3DInit()
{
HRESULT hr;
unsigned char *vb_Vertices;

hr=p_D3DDevice->CreateVertexBuffer(3*sizeof(my_vertex),
0,
D3D9T_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_triangle,NULL);


hr=g_triangle->Lock(0,0,(void **)&vb_Vertices,0);

memcpy(vb_Vertices,g_triangle_vertices, sizeof(g_triangle_vertices));

g_triangle->Unlock();

hr=p_D3DDevice->CreateVertexBuffer(4*sizeof(my_vertex),
0,
D3D9T_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&g_square,NULL);

hr=g_square->Lock(0,0,(void **)&vb_Vertices,0);

memcpy(vb_Vertices,g_square_vertices, sizeof(g_square_vertices));

g_square->Unlock();

return 1;

}

D3DFORMAT find_16bit_mode(void){
HRESULT hr;
hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_R5G6B5, D3DFMT_R5G6B5, false);

if (SUCCEEDED(hr)){
OutputDebugString("D3DFMT_R5G6B5\n");
return D3DFMT_R5G6B5;
}

hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
D3DFMT_X1R5G5B5, D3DFMT_X1R5G5B5, false);
if (SUCCEEDED(hr)){
OutputDebugString("D3DFMT_R5G5B5\n");
return D3DFMT_R5G6B5;
}

return (D3DFORMAT)NULL;

}

void D3DEnable(){
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE display_mode;

P_D3D=Direct3DCreate9(D3D_SDK_VERSION);
hr=P_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display_mode);

ZeroMemory(&d3dpp, sizeof(d3dpp));

d3dpp.SwapEffect= D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow=hWnd;
d3dpp.BackBufferCount=1;

if (fullscreen){
d3dpp.Windowed=false;
d3dpp.BackBufferWidth=sw;
d3dpp.BackBufferHeight=sh;
d3dpp.BackBufferFormat=find_16bit_mode();
}
else
{
d3dpp.Windowed=true;
d3dpp.BackBufferFormat=display_mode.Format;
}

hr=P_D3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&p_D3DDevice);

}


void D3DDisable()
{
if (p_D3DDevice){
p_D3DDevice->Release();
p_D3DDevice=NULL;
}

if(P_D3D){
P_D3D->Release();
P_D3D=NULL;
}

if(g_triangle){
g_triangle->Release();
g_triangle=NULL;
}

if(g_square){
g_square->Release();
g_square=NULL;
}
}

void D3DSceneShow()
{
static unsigned char red=0, green=0, blue=0;

srand( (unsigned)(time(NULL)));
red=rand()%255;
green=rand()%255;
blue=rand()%255;

p_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,0,1.0f,0);

if (SUCCEEDED(p_D3DDevice->BeginScene())){
p_D3DDevice->SetStreamSource(0,g_triangle,0,sizeof(my_vertex));
p_D3DDevice->SetFVF( D3D9T_CUSTOMVERTEX );
p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
p_D3DDevice->SetStreamSource(0,g_square,0,sizeof(my_vertex));
p_D3DDevice->SetFVF( D3D9T_CUSTOMVERTEX );
p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);

p_D3DDevice->EndScene();
}

p_D3DDevice->Present(NULL, NULL, NULL, NULL);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
GetWindowRect(hWnd, &rect);
sw=rect.right-rect.left;
sh=rect.bottom-rect.top;
return 0;

case WM_SIZE:
return 0;

case WM_CLOSE:
ShowWindow(hWnd, SW_HIDE);
PostQuitMessage(0);
return 0;

case WM_DESTROY:
return 0;

case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
return 0;

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

int APIENTRY WinMain(HINSTANCE HiNSTANCE, HINSTANCE HpREViNSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
MSG msg;
bool bQuit=false;

if (MessageBox(NULL, "是否选择全屏现实模式?", "全屏方式运行?", MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=0;
}

wc.style=CS_OWNDC;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="Name";
RegisterClass(&wc);

if (fullscreen)
{
hWnd=CreateWindow("Name",
"Lesson1",
WS_POPUP|WS_CLIPSIBLINGS|WS_VISIBLE,
0, 0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL, NULL,
hInstance,
NULL);

}
else
{
hWnd=CreateWindow("Name",
"Lesson1",
WS_TILEDWINDOW|WS_VISIBLE,
GetSystemMetrics(SM_CXSCREEN)/2-sw/2,
GetSystemMetrics(SM_CYSCREEN)/2-sh/2,
sw,sh,
NULL, NULL,
hInstance,
NULL);
ChangeDisplaySettings(NULL, 0);
}
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);

D3DEnable();
D3DInit();

if (!fullscreen)
{
GetWindowRect(hWnd, &rect);
sw=rect.right-rect.left ;
sh=rect.bottom-rect.top;

}

while(!bQuit)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
if (msg.message==WM_QUIT)
bQuit=true;
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
D3DSceneShow();
}
}
D3DDisable();
ShowWindow(hWnd, SW_HIDE);
DestroyWindow(hWnd);
ChangeDisplaySettings(NULL, 0);

return msg.wParam ;
return 0;
}
myling 2005-01-10
  • 打赏
  • 举报
回复
当时没仔细看你的代码

回来一看,那个汗阿

里面根本好多语法错误!

D8和D9混着用
非全屏模式设置不对
……

你这真是照着书写的?
火猴 2005-01-10
  • 打赏
  • 举报
回复
修改了也不行啊,~~
myling 2005-01-10
  • 打赏
  • 举报
回复
你的FVF格式设的不对的说
D3DFVF_XYZRHW是转换后的位置
而你的坐标明显是没经过转换的位置
所以应该用D3DFVF_XYZ

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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