level 1
lql20095
楼主
系统:vista
工具:VS2008
只能画出来一个黑背景,代码如下:
// D3D_DEMO1.cpp : 定义应用程序的入口点。
#include "stdafx.h"
#include "D3D_DEMO1.h"
#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#include <atlstr.h>
#define MAX_LOADSTRING 100
#define D3DFVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)
// 全局变量:
HINSTANCE hInst;
LPDIRECT3D9 myd3d=NULL;
LPDIRECT3DDEVICE9 myd3ddevice=NULL;
LPDIRECT3DVERTEXBUFFER9 myvertexbuffer=NULL;
struct myvertex
{
float x,y,z;
DWORD color;
};
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
HRESULT InitD3D(HWND hWnd)
{
if (NULL==(myd3d=Direct3DCreate9(D3D_SDK_VERSION)))
return false;
D3DDISPLAYMODE d3ddm;
if (myd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))
return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed=true;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=d3ddm.Format;
if( myd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &myd3ddevice))
return false;
myvertex v[]=
{ {1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0),},
{200.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 0),},
{100.0f, 200.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 0),},
};
myd3ddevice->CreateVertexBuffer(sizeof(v), 0, D3DFVF, D3DPOOL_DEFAULT, &myvertexbuffer, NULL);
VOID* pvertexs;
myvertexbuffer->Lock(0, sizeof(v), (VOID**) &pvertexs, 0);
memcpy(pvertexs, v, sizeof(v));
myvertexbuffer->Unlock();
return true;
}
VOID Cleanup()
{
if(myd3ddevice!=NULL)
myd3ddevice->Release();
if(myd3d!=NULL)
myd3d->Release();
if(myvertexbuffer!=NULL)
myvertexbuffer->Release();
}
VOID Render()
{
if(NULL==myd3ddevice)
return;
myd3ddevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
myd3ddevice->BeginScene();
myd3ddevice->SetStreamSource(0, myvertexbuffer, 0, sizeof(myvertex));
myd3ddevice->SetFVF(D3DFVF);
myd3ddevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
myd3ddevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
myd3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
myd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
myd3ddevice->EndScene();
myd3ddevice->Present(NULL, NULL, NULL, NULL);
}
{
WNDCLASSEX wc={sizeof(WNDCLASSEX), CS_HREDRAW|CS_VREDRAW, WndProc,0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL,L"myd3d_demo", NULL};
RegisterClassEx(&wc);
HWND hWnd=CreateWindow(L"myd3d_demo", L"myd3d_demo", WS_OVERLAPPEDWINDOW, 0, 0, 1024,768, GetDesktopWindow(), NULL,wc.hInstance, NULL);
MSG msg;
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_D3D_DEMO1));
if (InitD3D(hWnd))
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Cleanup();
UnregisterClass(L"myd3d_demo", wc.hInstance);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{...
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//画图
Render();
EndPaint(hWnd, &ps);
break;
...
}
2010年04月05日 12点04分
1
工具:VS2008
只能画出来一个黑背景,代码如下:
// D3D_DEMO1.cpp : 定义应用程序的入口点。
#include "stdafx.h"
#include "D3D_DEMO1.h"
#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
#include <atlstr.h>
#define MAX_LOADSTRING 100
#define D3DFVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)
// 全局变量:
HINSTANCE hInst;
LPDIRECT3D9 myd3d=NULL;
LPDIRECT3DDEVICE9 myd3ddevice=NULL;
LPDIRECT3DVERTEXBUFFER9 myvertexbuffer=NULL;
struct myvertex
{
float x,y,z;
DWORD color;
};
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
HRESULT InitD3D(HWND hWnd)
{
if (NULL==(myd3d=Direct3DCreate9(D3D_SDK_VERSION)))
return false;
D3DDISPLAYMODE d3ddm;
if (myd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))
return false;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed=true;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=d3ddm.Format;
if( myd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &myd3ddevice))
return false;
myvertex v[]=
{ {1.0f, 1.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0),},
{200.0f, 0.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 0),},
{100.0f, 200.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 0),},
};
myd3ddevice->CreateVertexBuffer(sizeof(v), 0, D3DFVF, D3DPOOL_DEFAULT, &myvertexbuffer, NULL);
VOID* pvertexs;
myvertexbuffer->Lock(0, sizeof(v), (VOID**) &pvertexs, 0);
memcpy(pvertexs, v, sizeof(v));
myvertexbuffer->Unlock();
return true;
}
VOID Cleanup()
{
if(myd3ddevice!=NULL)
myd3ddevice->Release();
if(myd3d!=NULL)
myd3d->Release();
if(myvertexbuffer!=NULL)
myvertexbuffer->Release();
}
VOID Render()
{
if(NULL==myd3ddevice)
return;
myd3ddevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
myd3ddevice->BeginScene();
myd3ddevice->SetStreamSource(0, myvertexbuffer, 0, sizeof(myvertex));
myd3ddevice->SetFVF(D3DFVF);
myd3ddevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
myd3ddevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
myd3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
myd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
myd3ddevice->EndScene();
myd3ddevice->Present(NULL, NULL, NULL, NULL);
}
{
WNDCLASSEX wc={sizeof(WNDCLASSEX), CS_HREDRAW|CS_VREDRAW, WndProc,0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL,L"myd3d_demo", NULL};
RegisterClassEx(&wc);
HWND hWnd=CreateWindow(L"myd3d_demo", L"myd3d_demo", WS_OVERLAPPEDWINDOW, 0, 0, 1024,768, GetDesktopWindow(), NULL,wc.hInstance, NULL);
MSG msg;
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_D3D_DEMO1));
if (InitD3D(hWnd))
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Cleanup();
UnregisterClass(L"myd3d_demo", wc.hInstance);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{...
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//画图
Render();
EndPaint(hWnd, &ps);
break;
...
}