日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)業(yè)內(nèi)動(dòng)態(tài) 業(yè)內(nèi)資訊 → 制作3D游戲文字的顯示方式

      制作3D游戲文字的顯示方式

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/9/1 21:51:49字體大。A-A+

      作者:佚名點(diǎn)擊:238次評(píng)論:0次標(biāo)簽: 3D 游戲

      • 類(lèi)型:游戲存檔大小:0KB語(yǔ)言:中文 評(píng)分:10.0
      • 標(biāo)簽:
      立即下載

       如果是制作一個(gè)游戲,文字是其中比不可少的一部分,這篇文章主要討論Direct3D中3中顯示文字的方式。

       1. ID3DXFont

          D3DX 庫(kù)提供了一系列基于ID3DXFont的接口來(lái)繪制文字。IDXDFont 是基于GDI 來(lái)繪制文字的。正因?yàn)榇,ID3DFont能提供非常復(fù)雜的字體和格式,但是效率顯然沒(méi)直接往顯卡上畫(huà)東西高了。

           創(chuàng)建和顯示一個(gè)ID3DXFont通常需要如下幾個(gè)步驟
       (1) 填充 D3DXFONT_DESC結(jié)構(gòu)體。

      1 D3DXFONT_DESC fontDesc;
      2 ZeroMemory(&fontDesc, sizeof(D3DXFONT_DESC));
      3 fontDesc.Height = 25; // in logical units
      4   fontDesc.Width = 12; // in logical units
      5   fontDesc.Weight = 500; // boldness, range 0(light) - 1000(bold)
      6   fontDesc.MipLevels = D3DX_DEFAULT;
      7 fontDesc.Italic = false;
      8 fontDesc.CharSet = DEFAULT_CHARSET;
      9 fontDesc.OutputPrecision = 0;
      10 fontDesc.Quality = 0;
      11 fontDesc.PitchAndFamily = 0;
      12 lstrcpy (fontDesc.FaceName, _T("Times New Roman"));

         (2) 創(chuàng)建 ID3DXFont 接口 。

         (3) 調(diào)用 ID3DXFont::DrawText() 繪制文字。

       1 //Draw the scene
      2  Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x0000ffff, 1.0f, 0);
      3 Device->BeginScene();
      4 RECT rect = {250, 200, Width, Height};
      5 font->DrawText(NULL,
      6 _T("ID3DXFont"),
      7 -1, // size of string or -1 indicates null terminating string
      8   &rect, // rectangle text is to be formatted to in windows coords
      9   DT_TOP | DT_LEFT, // draw in the top left corner of the viewport
      10   0xffff0000); // black text
      11  Device->EndScene();
      12 Device->Present(0,0,0,0);

       得到了如下圖 1所示的文字:

      ID3DXFont
      圖 1

          嗯, 非常簡(jiǎn)單!!不是嗎?

      2. CD3DFont

          在以前版本的Directx SDK 中提供了一個(gè)類(lèi)CD3DFont 來(lái)繪制文字,該類(lèi)主要用紋理三角形和Direct3D來(lái)渲染文字,所以其效率要高于用ID3DXFont::DrawText() 。但是這種方法的缺點(diǎn)就是不能像ID3DXFont::DrawText()那樣有提供復(fù)雜的字體和格式。這個(gè)example在最新的Directx SDK中已經(jīng)取消掉,所以在這里也不過(guò)多介紹。個(gè)人認(rèn)為CD3DFont就是個(gè)雞肋。我看了下最新Directx SDK下的Text3D樣列,發(fā)現(xiàn)只用了ID3DXFont::DrawText()方法和下面介紹的D3DXCreateText方法。

       3. D3DXCreateText

          使用這種方式來(lái)渲染文字就會(huì)像渲染幾何體一樣來(lái)渲染。如下圖 2:

      D3DCreateText

      圖 2

         使用D3DXCreateText()來(lái)渲染文字就是簡(jiǎn)單的把文字認(rèn)為是一個(gè)ID3DXMesh,然后就以渲染ID3DXMesh的方式來(lái)渲染文字。 下面是一個(gè)簡(jiǎn)單的例子:

          (1). 首先需要得到我們屏幕的DC和我們需要?jiǎng)?chuàng)建的字體, 這里調(diào)用的是Win32的API和結(jié)構(gòu)體。

      1 HDC hdc = CreateCompatibleDC(0);
      2 HFONT hFont;
      3 HFONT hFontOld;
      4 LOGFONT lf;
      5 ZeroMemory(&lf, sizeof(LOGFONT));
      6 lf.lfHeight = 25; // in logical units
      7   lf.lfWidth = 12; // in logical units
      8   lf.lfEscapement = 0;
      9 lf.lfOrientation = 0;
      10 lf.lfWeight = 500; // boldness, range 0(light) - 1000(bold)
      11   lf.lfItalic = false;
      12 lf.lfUnderline = false;
      13 lf.lfStrikeOut = false;
      14 lf.lfCharSet = DEFAULT_CHARSET;
      15 lf.lfOutPrecision = 0;
      16 lf.lfClipPrecision = 0;
      17 lf.lfQuality = 0;
      18 lf.lfPitchAndFamily = 0;
      19 lstrcpy(lf.lfFaceName, _T("Times New Roman")); // font style
      20   hFont = CreateFontIndirect(&lf);
      21 hFontOld = (HFONT)SelectObject(hdc, hFont);

        (2). 然后調(diào)用D3DXCreateText()接口來(lái)創(chuàng)建ID3DXMesh。

       1 D3DXCreateText(Device, hdc, _T("Direct 3D"),0.001f, 0.4f, &Text, 0, 0);

           (3).不要忘了刪除資源
      1 SelectObject(hdc, hFontOld);
      2 DeleteObject(hFont);
      3 DeleteDC(hdc);

          (4). 然后是D3D在典型的幾步: 設(shè)置燈光, 設(shè)置坐標(biāo)系, 設(shè)置攝像頭, 視口轉(zhuǎn)換

          (5). 一切準(zhǔn)備完畢了, 就可以顯示文字了。

       Code highlighting produced by Actipro CodeHighlighter (freeware)
      http://www.CodeHighlighter.com/

      1 //Draw the scene
      2   Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
      3 Device->BeginScene();
      4 Device->SetMaterial(&d3d::WHITE_MTRL);
      5 Text->DrawSubset(0);
      6 Device->EndScene();
      7 Device->Present(0, 0, 0, 0);

       這樣一個(gè)如圖 2 所示的圖片就出來(lái)了。

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門(mén)評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱(chēng):
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)