登 录
晚上看了“3D游戏从头编”的第四篇渲染 通过里面的例子体会了渲染中的一些基本的概念例如vetex, FVF(Flexible vertex format),顶点缓冲区等等看了教材自己尝试了一下把代码剪下拼合,结果编译执行没有任何结果。后来下了配套的源代码。发现原来还少了几句,之后调试成功。 下面是程序的代码。#include <d3d8.h> #pragma comment(lib,"d3d8.lib") LPDIRECT3D8 g_pD3D = NULL; // 用来创建D3D设备 LPDIRECT3DDEVICE8 g_pd3dDevice = NULL; // D3D设备 LPDIRECT3DVERTEXBUFFER8 g_pVB = NULL; // 顶点缓冲区 // 自定义顶点结构 struct CUSTOMVERTEX { FLOAT x, y, z; // 顶点坐标 DWORD color; // 顶点颜色 }; // 我们自定义的FVF,定义了顶点的结构 // D3DFVF_XYZ : 表示顶点坐标 // D3DFVF_DIFFUSE : 表示一个顶点颜色 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) // 初始化D3D HRESULT InitD3D( HWND hWnd ) { // 创建D3D对象 if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) ) return E_FAIL; // 获取当前的显示模式 D3DDISPLAYMODE d3ddm; if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) return E_FAIL; D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; // 窗口模式 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 设置交换模式 d3dpp.BackBufferFormat = d3ddm.Format; // 设置背景缓冲区格式为当前左面格式 // 创建D3D设备 // 第一个参数:使用默认的显卡适配器 // 第二个参数:请求使用硬件抽象层(HAL) // 第三个参数:窗口句柄 // 第四个参数:使用软件处理顶点 // 第五个参数:创建的参数 // 第六个参数:创建的D3D设备指针 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } // 关闭culling,让我们能看到3角型的正反面 g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); // 关闭灯光,因为我们的顶点有自己的颜色 g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); return S_OK; } // 填充顶点缓区 HRESULT InitGeometry() { // 初始化一个三角形 CUSTOMVERTEX g_Vertices[] = { { -1.0f,-1.0f, 0.0f, 0xffff0000, }, { 1.0f,-1.0f, 0.0f, 0xff0000ff, }, { 0.0f, 1.0f, 0.0f, 0xffffffff, }, }; // 创建顶点缓冲区 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB ) ) ) { return E_FAIL; } // 填充顶点缓冲区 VOID* pVertices; if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, g_Vertices, sizeof(g_Vertices) ); g_pVB->Unlock(); return S_OK; } // 释放D3D VOID Cleanup() { // 释放地点缓冲区 if( g_pVB != NULL ) g_pVB->Release(); // 释放D3D设备 if( g_pd3dDevice != NULL) g_pd3dDevice->Release(); // 释放D3D if( g_pD3D != NULL) g_pD3D->Release(); } // 渲染 VOID Render() { if( NULL == g_pd3dDevice ) return; // 清除背景为兰色 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 ); // 开始绘制场景 g_pd3dDevice->BeginScene(); // --渲染图形-- // 指定渲染源 g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) ); // 指定自定义的FVF g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX ); // 渲染 g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 ); // 结束场景绘制 g_pd3dDevice->EndScene(); // 显示到屏幕上 g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } // 消息处理 LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: // 退出消息 PostQuitMessage( 0 ); return 0; case WM_PAINT: // 绘制 Render(); ValidateRect( hWnd, NULL ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } // WinMain程序入口 INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { // 注册窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "D3D Tutorial", NULL }; RegisterClassEx( &wc ); // 创建窗口 HWND hWnd = CreateWindow( "D3D Tutorial", "3D游戏从头编", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hInstance, NULL ); // 初始化D3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { if( SUCCEEDED( InitGeometry() ) ) { // 显示窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); // 消息循环 MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } } // 结束处理 Cleanup(); UnregisterClass( "D3D Tutorial", wc.hInstance ); return 0; } 程序 执行结果如下:
抱歉!评论已关闭.