




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章:绘制三角形Introduction(序)所有的 3D 图形都是由三角形构成的。为什么是三角形而不是别的图形呢?因为三角形有许多优越之处,例如:绘制效率。(译者:而且我们知道,任意不在同一条直线上的三个点都能构成三角形,这对于在空间中形成某种复杂图形是很有益处的,我的理解)所以,如果我们想得到一个矩形,最有效率的是绘制两个相同的合并的三角形,这样要优于直接绘制一个矩形。所以,本教程下面将告诉你如何绘制复杂物体的最小单元:三角形。(译者:神奇的三角形啊.)Vertices (顶点)顶点(vertex)是什么?顶点就是3D空间中的一个点。例如,三角形有三个顶点,而矩形有四个。在3D空间中,你
2、可以用三个顶点来指定一个三角形。想做到这些,你需要了解迪卡尔坐标系统。2D Cartesian coordinate system (2D 迪卡尔坐标系统)下面的两幅图演示了2D 迪卡尔坐标系统是怎样工作的。Fig 2.1Fig 2.22D迪卡尔坐标系统是很简单的,用两条轴x、y的值来表示点的位置,进而表现出图形的位置。这是初中时我们就学习过的。3D Cartesian coordinate system (3D 迪卡尔坐标系统)下面的两幅图演示了左手3D 迪卡尔坐标系统是怎样工作的。Fig 2.3Fig 2.42D坐标系统只有x轴与y轴,因为它是平面的。而在3D空间里,两个轴显然不够用了,所
3、以,有了第三个轴:z轴。现在,我们用这三个轴就能在3D空间中表示出物体的任意位置了。这其实是很简单的事情,我就不多说了。 3D Primitives Primitive 为“原始”之意,3D primitive 就是设备所支持的原始的类型。它包括:点列、线列、线代、三角形列、三角形带 和 三角扇形。使用3D primitive 完成上述的图形是很方便的。以后我们会用3D primitive 来绘制图形。下面的一些例子演示了上述的各种方式:Point Lists(点列)Fig 2.5Line Lists(线列)Fig 2.6Line Strips(线带)Fig 2.7Triangle Lists
4、(三角形列)Fig 2.8Triangle Strips(三角形带)Fig 2.9Triangle Fans(三角扇形)Fig 2.10Flexible Vertex Format (FVF) (灵活顶点格式)Flexible的意思是“灵活的”。这里不译为“灵活的顶点格式”而译为“灵活顶点格式”是有原因的:前者是一个短语,像是广告词一样;后者才更像是一种名词或术语。所以,我取了后者。灵活顶点格式(FVF)是用来描述顶点属性的一种格式,而这种格式是可以由我们自定义的,所以称它为“灵活顶点格式”。至此,我们至少知道了顶点有三种属性:x值、y值和z值。其实顶点还可以有其他属性,例如颜色与亮度。利用灵
5、活顶点格式(FVF)我们能方便的指定顶点的属性。如果我们在Direct3D指定了一个多边形,这个多边形将可以被它的各个顶点的属性所填充,带有过渡性的属性填充。我知道这个不太好理解,没关系,下面我们有例子,它也正是这样做的:在我们下面的例子中,将会有一个三个顶点所组成的三角形,三角形的每个顶点的颜色都是不同的,他们分别是红、绿、蓝,电脑中的三原色。三角形将会被这三种颜色混合的、渐变的填充起来。Vertex Buffers (顶点缓冲)顶点缓冲就是一块用于保存顶点的内存缓冲区。顶点缓冲可以保存任何的顶点类型。当你的一些顶点已经被保存在顶点缓冲区中,你就可以操作它们了,例如渲染、变换和剪裁。Colo
6、urs (颜色)在DirectX中,如果我们要指定一种颜色,我们可以用D3DCOLOR_XRGB宏。宏中有三个参数,每个参数都是0到255间的整数值,分别用于描述颜色的红、绿、蓝分量,然后D3DCOLOR_XRGB宏会将它们调和,就像水彩调色一样。例如:D3DCOLOR_XRGB(0, 0, 0) 是黑色(无色)。D3DCOLOR_XRGB(255, 255, 255) 是纯白色(满色调)。D3DCOLOR_XRGB(0, 255, 0) 是亮绿色(没有红与蓝,全是绿色的分量)。D3DCOLOR_XRGB(100, 20, 100) 是暗紫色 (100 红, 20 绿, 100 蓝)。好了,我
7、们第二章的例子就在这了。它和第一个例子差不多,只是添加了一些代码、做了些修改。仔细研究吧!Its easy!#include <d3d8.h>LPDIRECT3D8 g_pD3D = NULL;LPDIRECT3DDEVICE8 g_pD3DDevice = NULL;LPDIRECT3DVERTEXBUFFER8 g_pVertexBuffer = NULL; / Buffer to hold verticesstruct CUSTOMVERTEX FLOAT x, y, z, rhw; / The transformed position for the vertex. DWO
8、RD colour; / The vertex colour.;#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)#define SafeRelease(pObject) if(pObject != NULL) pObject->Release(); pObject=NULL;HRESULT InitialiseD3D(HWND hWnd) /First of all, create the main D3D object. If it is created successfully we /should get a po
9、inter to an IDirect3D8 interface. g_pD3D = Direct3DCreate8(D3D_SDK_VERSION); if(g_pD3D = NULL) return E_FAIL; /Get the current display mode D3DDISPLAYMODE d3ddm; if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm) return E_FAIL; /Create a structure to hold the settings for our
10、 device D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp); /Fill the structure. /We want our program to be windowed, and set the back buffer to a format /that matches our current display mode d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC; d3dpp.BackBufferFormat =
11、 d3ddm.Format; /Create a Direct3D device. if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice) return E_FAIL; return S_OK;HRESULT InitialiseVertexBuffer() VOID* pVertices; /Store each point of the triangle tog
12、ether with it's colour CUSTOMVERTEX cvVertices = /Vertex 1 - Red (250, 100) 250.0f, 100.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), /Vertex 2 - Green (400, 350) 400.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), /Vertex 3 - Blue (100, 350) 100.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), ;
13、 /Create the vertex buffer from our device if(FAILED(g_pD3DDevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer) return E_FAIL; /Get a pointer to the vertex buffer vertices and lock the vertex buffer if(FAILED(g_pVertexBuffer->Lock(
14、0, sizeof(cvVertices), (BYTE*)&pVertices, 0) return E_FAIL; /Copy our stored vertices values into the vertex buffer memcpy(pVertices, cvVertices, sizeof(cvVertices); /Unlock the vertex buffer g_pVertexBuffer->Unlock(); return S_OK;void Render() if(g_pD3DDevice = NULL) return; /Clear the backb
15、uffer to black g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); /Begin the scene g_pD3DDevice->BeginScene(); /Rendering our triangle g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, sizeof(CUSTOMVERTEX); g_pD3DDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
16、g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); /End the scene g_pD3DDevice->EndScene(); /Filp the back and front buffers so that whatever has been rendered on the /back buffer will now be visible on screen (front buffer). g_pD3DDevice->Present(NULL, NULL, NULL, NULL);void CleanUp()
17、SafeRelease(g_pVertexBuffer); SafeRelease(g_pD3DDevice); SafeRelease(g_pD3D);void GameLoop() /Enter the game loop MSG msg; BOOL fMessage; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); while(msg.message != WM_QUIT) fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE); if(fMessage) /Process m
18、essage TranslateMessage(&msg); DispatchMessage(&msg); else /No message to process, so render the current scene Render(); /The windows message handlerLRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch(msg) case WM_DESTROY: PostQuitMessage(0); return 0; break; cas
19、e WM_KEYUP: switch (wParam) case VK_ESCAPE: /User has pressed the escape key, so quit DestroyWindow(hWnd); return 0; break; break; return DefWindowProc(hWnd, msg, wParam, lParam);/Application entry pointINT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT) /Register the window class WNDCLASSEX
20、wc = sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "DX Project 2", NULL; RegisterClassEx(&wc); /Create the application's window WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, GetDesktopWindow(), NULL, wc.hInstance, NULL); /Initialize Direct
21、3D if(SUCCEEDED(InitialiseD3D(hWnd) /Show our window ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); /Initialize Vertex Buffer if(SUCCEEDED(InitialiseVertexBuffer() /Start game running: Enter the game loop GameLoop(); CleanUp(); UnregisterClass("DX Project 2", wc.hInstance); return 0
22、;运行程序,你会得到一个背景为黑色的窗口。窗口的中央是一个三角形,被三原色过渡填充的三角形,很漂亮,不是吗?真高兴,现在我们已经可以绘制一些真正的图形了。看图来说,上面的一些东西就不难理解了。好了,下面有一幅程序运行时的截图:嘿嘿,添加了几行代码,得到了如此漂亮的图形,不是很复杂,对吧?那末,我们都做了什么改动呢?WinMainWinMain函数作了细微的调整,就是初始化Direct3D后又调用了InitialiseVertexBuffer函数。g_pVertexBuffer这是顶点缓冲的指针。注意它是全局的,所以可以被所有的函数使用。这就是我们存储三角形的顶点的地方了,顶点缓冲,对,就是那个
23、。CUSTOMVERTEX这是我们自定义的顶点格式,为什么能自定义呢?对!因为Direct3D支持的灵活顶点格式(FVF)。其中我们都指定了x,y,z,rhw 和 颜色属性。D3DFVF_CUSTOMVERTEX上面的CUSTOMVERTEX乃是我们自定义的顶点格式,但自定义也不能随便定义,我们需要按照一定的规则,而且也需要通知DX我们的格式知怎样定义的。所以,我们定义了这个标识D3DFVF_CUSTOMVERTEX,它运用了DX原有的两个标识D3DFVF_XYZRHW和D3DFVF_DIFFUSE(已转换顶点和扩散颜色)定义了我们自己的格式,而且,跟上面我们定义的CUSTOMVERTEX格式
24、是相吻合的。明白了吗?也就是说:我们要按照DX支持的各种顶点属性和它们的标识来组合出我们自己需要的顶点格式和标识,而标识是用来通知DX的。InitialiseVertexBuffer这是一个新的函数,你已经猜到了:它是用来初始化定点缓冲的。在函数中,首先定义了一个CUSTOMVERTEX型的数组cvVertices,并按照前面我们所定义的格式输入了三个不同的顶点,位置不同颜色也不同。注意:在本例中,顶点的z值应该在0到1之间,因为现在的程序只能支持一些2D的图形,这样做是为了让程序最简单且容易理解。不用急,以后我们就会创建真正的3D图形了。然后我们利用设备借口调用了CreateVertexBuffer函数来初始化我们的顶点缓冲。注意第一个参数我们输入了顶点缓冲的大小,因为我们输入了三个顶点,所以是3个CUSTOMVERTEX的大小。此函数将给我们一个指向顶点缓冲的指针(g_pVertexBuffer)。这时我们的顶点缓冲已经创建好了,我们应该把我们指定好的顶点传送给它:锁定顶点缓冲-传送已经被保存的顶点-解除锁定。到这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司收购合同协议书
- 全程服务委托合同协议书
- 建筑安装工程劳务合同
- 招标文件中合同条款
- 《假如》教学课件-
- 人民数据:数据资产入表解决方案2024
- 敲墙合同范本
- 托盘加工制作合同范本
- 大庆个人租房合同范本
- 2025年度合作方试销标准版合同
- 小神仙简谱(音乐资料)
- JJG 539-2016数字指示秤
- JJF 1183-2007温度变送器校准规范
- GB/T 8642-2002热喷涂抗拉结合强度的测定
- GB/T 19289-2019电工钢带(片)的电阻率、密度和叠装系数的测量方法
- 九年级道德与法治第一学期期中考试质量分析报告
- GB/T 12750-2006半导体器件集成电路第11部分:半导体集成电路分规范(不包括混合电路)
- GB 3150-2010食品安全国家标准食品添加剂硫磺
- 沼气发电项目建议书
- 鸽巢问题(例1、例2)课件
- 大学物理上总复习课件
评论
0/150
提交评论