directx 新手求解答

CHENKAISSS 2012-06-27 08:46:10
#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")

LPDIRECT3D9 g_direct=NULL;
LPDIRECT3DDEVICE9 g_device=NULL;
LPDIRECT3DVERTEXBUFFER9 g_vertexbuffer=NULL;
LPDIRECT3DINDEXBUFFER9 g_indexbuffer=NULL;
struct VERTEX
{
float x,y,z,pi;
DWORD color;
};
bool g_fangjuchi=true;
#define VERTEXFVF (D3DFVF_DIFFUSE|D3DFVF_XYZRHW)

bool InitD3d(HWND hwnd)
{
if (NULL==(g_direct=Direct3DCreate9(D3D_SDK_VERSION)))
{
return false;
}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));
D3DDISPLAYMODE display;
d3dpp.Windowed=FALSE;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.MultiSampleType=D3DMULTISAMPLE_4_SAMPLES;
g_direct->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&display);
d3dpp.BackBufferHeight=display.Height;
d3dpp.BackBufferWidth=display.Width;
d3dpp.BackBufferFormat=display.Format;
if (FAILED(g_direct->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X8R8G8B8,FALSE,D3DMULTISAMPLE_4_SAMPLES,NULL)))
{
MessageBox(hwnd,_T("硬件不支持图形反锯齿!\n采用参考设备!"),L"AntiAlisa",0);
if (FAILED(g_direct->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_device)))
{
return false;
}
}
else
{
if (FAILED(g_direct->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_device)))
{
return false;
}
}
return true;
}
bool InitBuffer()
{
VERTEX dian[]=
{
{100.0f,50.0f,0.5f,1.0f,0xffff00ff},
{200.0f,400.0f,0.5f,1.0f,0xff00ff00},
{300.0f,50.0f,0.5f,1.0f,0xff0000ff},
{400.0f,400.0f,0.5f,1.0f,0xffffffff}
};
WORD index[]={2,1,0,1,2,3};// 为什么{0,1,2,1,2,3}不行
if (FAILED(g_device->CreateVertexBuffer(4*sizeof(VERTEX),0,VERTEXFVF,D3DPOOL_DEFAULT,&g_vertexbuffer,NULL)))
{
return false;
}
void *buffer;
if (SUCCEEDED(g_vertexbuffer->Lock(0,sizeof(dian),&buffer,0)))
{
memcpy(buffer,dian,sizeof(dian));
g_vertexbuffer->Unlock();
}
else
{
return false;
}
if (FAILED(g_device->CreateIndexBuffer(6*sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_indexbuffer,NULL)))
{
return false;
}
if (SUCCEEDED(g_indexbuffer->Lock(0,sizeof(index),&buffer,0)))
{
memcpy(buffer,index,sizeof(index));
g_indexbuffer->Unlock();
}
else
return false;
return true;
}
void render()
{
g_device->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
if (SUCCEEDED(g_device->BeginScene()))
{
g_device->SetStreamSource(0,g_vertexbuffer,0,sizeof(VERTEX));
g_device->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
g_device->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
if (g_fangjuchi)
{
g_device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS,TRUE);//启用多重取样
}
else
{
g_device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS,FALSE);
}
g_device->SetFVF(VERTEXFVF);
g_device->SetIndices(g_indexbuffer);
g_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2);
g_device->EndScene();
}
g_device->Present(NULL,NULL,NULL,NULL);
}
void clear()
{
if (g_indexbuffer!=NULL)
{
g_indexbuffer->Release();
}
if (g_vertexbuffer!=NULL)
{
g_vertexbuffer->Release();
}
if (g_device!=NULL)
{
g_device->Release();
}
if (g_direct!=NULL)
{
g_direct->Release();
}
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_DUOCHONGCAIYANG, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DUOCHONGCAIYANG));

ZeroMemory(&msg,sizeof(MSG));
while(msg.message!=WM_QUIT)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
render();
}
return (int) msg.wParam;
}



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case WM_DESTROY:
{
PostQuitMessage(0);
clear();
}
break;
case WM_LBUTTONDOWN:
g_fangjuchi=!g_fangjuchi;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
自动生成的我都删了 就是WORD index[]={2,1,0,1,2,3};这一行 太坑了 开始写的是{0,1,2,1,2,3} 结果只能输出后面的那个三角形 改为2 1 0才能输出前面的 这是什么状况 快疯了
...全文
110 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHENKAISSS 2012-07-10
  • 打赏
  • 举报
回复
还有这个规则? 书上都没说 好吧 就这样认为吧
elemusic 2012-07-09
  • 打赏
  • 举报
回复
索引顺序要统一,顺时针为正,你画个图看看,012是顺的,123是逆的,所以才不能显示正确吧

19,468

社区成员

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

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