画三角形
bool InitializeObjects()
{
// Fill in our structure to draw a triangle.
// x, y, z, color.
stD3DVertex objData[] =
{
{ 320.0f, 150.0f, 0, 1, D3DCOLOR_XRGB(255, 255, 0), },
{ 420.0f, 350.0f, 0, 1, D3DCOLOR_XRGB(255, 0, 0), },
{ 220.0f, 350.0f, 0, 1, D3DCOLOR_XRGB(0, 255, 0), },
};
// Create the vertex buffer.
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()
{
// Clear the backbuffer.
g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0);
// Begin the scene. Start rendering.
g_D3DDevice->BeginScene();
// Bind data to the stream, set fvf so D3D knows how our data
// is made up, then render the object.
g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0, sizeof(stD3DVertex));
g_D3DDevice->SetFVF(D3DFVF_VERTEX);
g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
// End the scene. Stop rendering.
g_D3DDevice->EndScene();
// Display the scene.
g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
先调用SetStreamSource()函数(原书这里错写成了SetStreamObjects()函数)将顶点缓存设为渲染流。SetStreamSource()函数的参数包括要设置的流索引(从0到最大流数-1)、开始渲染缓存的偏移字节量和顶点跨度。顶点跨度指的是正在渲染的缓存中,在几何图形中定义单个点时用到的顶点结构大小。
完成流设置后,就可以设置顶点格式FVF。这样,Direct3D就可以知道正在发送的数据格式。SetFVF()函数中最合适的标识符是用来指定顶点格式的标识符。源文件全局部分的最后一行代码是一个#define语句(参见程序清单1.11),该语句定义了绘制线段必须用到的名为D3DFVF_VERTEX标识符。对程序中用到的每个顶点结构而言,都应该有一个匹配的顶点格式。
绘制出顶点缓存内容的最后一个步骤是调用DrawPrimitive()函数。DrawPrimitive()函数将绘制出当前设置为流的顶点缓存内容。该函数的参数包括:要渲染的图元类型、开始渲染的起始顶点索引(开始为0)以及要渲染的图元数目。由于这里指定在屏幕上绘制两条线段,因为最后一个参数的值为2。图元类型(第一个参数)可以是D3DPT_POINTLIST、3DPT_LINELIST、3DPT_LINESTRIP、3DPT_TRIANGLELIST、3DPT_TRIANGLESTRIP或3DPT_TRIANGLEFAN。
投影 Ortho 正交投影
通过正交投影可以指定幅度比和远近剪切平面。Direct3D通过剪切平面可以很容易地确定视觉范围内外的物体。正交投影和2D物体打交道。为程序设置正交投影就可以指定远近剪切平面。这样可以设定要渲染内容的幅度比。
调用D3DXMatrixOrthoLH()函数就可以在场景中使用左手正交投影。该函数的参数包括:保存正交矩阵的D3DXMATRIX对象、窗口分辨率的宽度和高度,以及远近剪切平面值。调用设备函数SetTransform()函数的参数包括正在使用的矩阵类型和矩阵。
D3DXMatrixOrthoLH(
&g_ortho, // 保存正交矩阵的D3DXMATRIX对象
WINDOW_WIDTH, // 窗口分辨率的宽度
WINDOW_HEIGHT, // 窗口分辨率的高度
0.1f, // 最近点
1000.0f // 最远点
);
// 从视图空间(摄象机空间)到到屏幕的投影转换
g_D3DDevice->SetTransform(D3DTS_PROJECTION, &g_ortho);
bool InitializeObjects()
{
// Set the projection matrix.
D3DXMatrixOrthoLH(&g_ortho, WINDOW_WIDTH, WINDOW_HEIGHT, 0.1f, 1000.0f);
g_D3DDevice->SetTransform(D3DTS_PROJECTION, &g_ortho);
// Set default rendering states.
g_D3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
// Fill in our structure to draw an object.
// x, y, z, color.
stD3DVertex objData[] =
{
{-150.0f, -150.0f, 0.1f, D3DCOLOR_XRGB(255,255,0)},
{150.0f, -150.0f, 0.1f, D3DCOLOR_XRGB(255,0,0)},
{0.0f, 150.0f, 0.1f, D3DCOLOR_XRGB(0,0,255)}
};
// Create the vertex buffer.
if(FAILED(g_D3DDevice->CreateVertexBuffer(3 * sizeof(stD3DVertex), 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;
}
g_D3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); //设置渲染 开启渲染