我这个是照葫芦画瓢,为什么没有两条白线呢?DirectX
#include<d3d9.h>#include<d3dx9.h>
// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
// 定义了一个顶点缓存对象
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;
// 定义场景中单个3D点的结构
struct stD3DVertex
{
float x, y, z, rhw; // 点的x,y,z坐标值
unsigned long color; // 点的颜色
};
// 定义顶点格式标识符,即灵活顶点格式
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
// 初始化Direct3D
bool InitializeD3D(HWND hWnd, bool fullscreen)
{
D3DDISPLAYMODE displayMode;
// 创建Direct3D接口对象
g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_D3D == NULL) return false;
// 获得当前显卡的显示模式
if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
return false;
// 建立D3DPRESENT_PARAMETERS结构,用于定义Direct3D窗口的显示信息
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
if(fullscreen)
{
d3dpp.Windowed = FALSE;
d3dpp.BackBufferWidth = 1024;
d3dpp.BackBufferHeight = 768;
//判断系统分辨率是否大于游戏所需分辨率
if ((GetSystemMetrics(SM_CXSCREEN) < 1024) || (GetSystemMetrics(SM_CYSCREEN) < 768))
MessageBox(NULL,"当前系统分辨率小于1024×768", "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
}
else
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = displayMode.Format;
// Create the D3DDevice
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
{
return false;
}
return true;
}
// 用于创建演示程序中要绘制在屏幕上的物体
bool InitializeObjects()
{
unsigned long col = D3DCOLOR_XRGB(255, 255, 255);
// Fill in our structure to draw an object.
// x, y, z, rhw, color.
// objData结构体数组:设置所有点的数据
stD3DVertex objData[] =
{
{ 420.0f, 150.0f, 0.5f, 1.0f, col, },// 第1个点的坐标及颜色
{ 420.0f, 350.0f, 0.5f, 1.0f, col, },// 第2个点的坐标及颜色
{ 220.0f, 150.0f, 0.5f, 1.0f, col, },// 第3个点的坐标及颜色
{ 220.0f, 350.0f, 0.5f, 1.0f, col, },// 第4个点的坐标及颜色
};
// 创建顶点缓存
if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0,
D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
NULL))) return false;
// Fill the vertex buffer.
void *ptr;
// 锁定顶点缓存,以进行读写操作
if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData),
(void**)&ptr, 0))) return false;
// 将数据复制到该缓存中
memcpy(ptr, objData, sizeof(objData));
// 对顶点缓存进行解锁
g_VertexBuffer->Unlock();
return true;
}
void RenderScene()
{
// 清空后台缓存
g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
// 开始绘制,开始渲染
g_D3DDevice->BeginScene();
// 设置顶点数据流的输入源
g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0,
sizeof(stD3DVertex));
g_D3DDevice->SetFVF(D3DFVF_VERTEX); // 设置顶点格式
g_D3DDevice->DrawPrimitive(D3DPT_LINELIST, 0, 2); // 进行绘制
// 结束绘制,停止渲染
g_D3DDevice->EndScene();
// 显示绘制的结果
g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
void Shutdown()
{
if(g_D3DDevice != NULL) g_D3DDevice->Release();
if(g_D3D != NULL) g_D3D->Release();
if(g_VertexBuffer != NULL) g_VertexBuffer->Release();
g_D3DDevice = NULL;
g_D3D = NULL;
g_VertexBuffer = NULL;
}
// 窗口过程函数(系统自动调用,即回调函数)
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYUP:
if(wParam == VK_ESCAPE) PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
// 注册窗口相关类型
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"DirectX_GAME", NULL };
RegisterClassEx(&wc);
// 创建这个注册好的应用程序窗口
HWND hWnd = CreateWindow("DirectX_GAME", "DirectX_Project", WS_OVERLAPPEDWINDOW,
0, 0, 1024, 768, GetDesktopWindow(), NULL,
wc.hInstance, NULL);
// 隐藏鼠标指针
ShowCursor(FALSE);
// 初始化 Direct3D
if(InitializeD3D(hWnd, true))
{
// 显示该窗口
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// 进入消息循环
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while(msg.message != WM_QUIT)// 只要不是退出命令,就一直循环
{
// 从消息队列中获取下一条消息
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
// 对相关消息进行一些转换
TranslateMessage(&msg);
// 将转换后的消息发送给消息过程函数
DispatchMessage(&msg);
}
else
// 处理向屏幕绘制图像的代码部分
RenderScene();
}
}
// 释放所有的Direct3D对象
Shutdown();
// 注销窗口类
UnregisterClass("DirectX_GAME", wc.hInstance);
return 0;
}
基本上就是照葫芦画瓢。。。但是教程上给的图片,画出了两条白线,我怎么就画不出来。。。 没有设置摄像机坐标什么的吧,这样的话四个点的坐标要调节一下,不然在默认的视图空间里看不到它们。 我初始化函数没有调用。。。OTZ我太二了
谢谢shawind大 unsigned long col = D3DCOLOR_XRGB(255, 255, 255);
我想先请你用DWORD 而不是 ulong……
ulong是没有符号的
而 255, 255, 255 得出来的是 -1,因为有个Alpha值为255
所以就是
color = ((255 << 24)|(red << 16) | (green << 8) | blue)
结果自己算算吧。 我记得C++里面
type unsigned long DWORD
至少 我看了VS08的declare是这样的
页:
[1]