簡體   English   中英

在DirectX 9中如何在沒有D3DX9的情況下繪制線條和字體?

[英]How to draw line and font without D3DX9 in DirectX 9?

我看到Microsoft不推薦D3DX9,Windows SDK也不附帶D3DX9。 我想采用。

我缺少線條畫工具。

如何在“新” DirectX9中替換ID3DXLine和ID3DXFont?

通常,線條和字體是精靈。 ID3DXLineID3DXFontID3DXFont使用ID3DXSprite接口。 (當然,還有其他選擇,但最常用的是精靈方法)

繪制精靈

因此,首先,您將需要第三者或您自己的精靈渲染器。 通常,“卧室”精靈引擎的開發包括以下階段:

  • 繪制一堆簡單的彩色方形框(形成矩形的兩個三角形)。 有不同的技術,但即使是最簡單的“多合一頂點緩沖區”方法也不錯。 更高級的技術包括實例化,點精靈,幾何體着色器和細分技巧(在DX9中不適用最后兩個技巧)。 但是,甚至不要嘗試通過百萬次抽獎來抽出百萬張精靈;)
  • 對那些四邊形進行紋理處理。 您將需要位圖加載器。 如果您根本不想使用D3DX,則可以選擇開源FreeImage庫,例如編寫自己的加載器。
  • 使用批處理優化渲染。 對Sprite進行排序,以最大程度減少繪圖調用次數和/或最小化上下文狀態更改。
  • 使用紋理地圖集優化紋理。 您將需要解決矩形打包算法(網絡上已經有很多實現,或者是數學書),並推出某種紋理圖集格式。

您可以選擇停止的階段。 稍后,您可以返回並繼續。

畫線

然后,對於直線,您只需繪制一個細的矩形精靈即可。 用戶將輸入諸如線條的開始,結束和粗細之類的值,並且您將需要做一些簡單的數學運算來計算此子畫面的位置和旋轉。 Sprite可以僅是彩色的,也可以具有紋理的:對於虛線,帶狀線,帶有粉紅色蓬松小貓的線等。然后,您可以將曲線實現為一組直線。 您可以選擇將精靈添加到行尾,例如箭頭。

繪圖文字

對於文本,事情可能會非常復雜(我將僅在此介紹精靈字體):

  • 每個角色都是一個小精靈
  • 你在上面畫一個字母的紋理
  • 您具有包含這些字母的紋理,並使用字典對其進行采樣。 字典是字符(或字符代碼)到其圖片所在位置的紋理坐標的地圖,以及諸如間距,字距調整等其他信息。
  • 您可以預先烘焙(離線)紋理圖集,其中包含所需的所有字體大小的所有字體的所有字母以及字典。 顯然,您的資源緩存中不能包含星球上所有語言的所有字母。
  • 您可以在運行時根據需要烘烤每個字符,並將其添加到緩存中(紋理圖集+詞典)

要將字符從字體文件(例如.ttf轉換為位圖(圖像),可以使用庫。 我知道FreeType是最好的開源。 您自己解析字體可能會很復雜。

然后,您可以將所有內容混合在一起,並用文本紋理繪制線條。 或繪制線條框包圍的文本。 或在其上方帶有文字的精靈。 或GUI。 所有這些東西將是精靈。

...或者只是不打擾

如果您仍在使用DirectX 9,是否真的需要打擾Windows SDK,刪除D3DX內容? 如果適合您,也許您可​​以繼續使用Direct SDK和D3DX進行開發? 請注意,如果由於某種原因決定遷移到DX11,則可以使用DirectXTK ,它可以部分替代D3DX11。 不過,您自己的解決方案或第三方解決方案可能會更靈活並且更適合您。 精靈在3D圖形中還有許多其他應用,例如廣告牌,GUI,粒子等。而且一如既往,重新發明輪子是一種非常有趣和積極的體驗;)

希望能幫助到你。 編碼愉快!

為什么不嘗試使用DirectX 11?

幾乎所有平台都支持Oterhwise OpenGL。

我建議嘗試使用SDL,它具有您可以想象的大多數2D東西的輔助方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM