渲染图元及投影

 画三角形

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);   //设置渲染 开启渲染

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值