直接模式,渲染器不可知論,輕巧的調試圖形API,用於C ++。
該軟件在公共領域。如果未確認該奉獻精神,您將獲得永久的,不可撤銷的許可,以復制,分發和修改源代碼,如您所見。
提供源代碼“原樣”,而無需任何明示或暗示的保證。不需要歸因,但是對作者的提及表示讚賞。
調試繪製是一個單一源文件庫,因此“標題”正向聲明和實現包含在同一文件中( debug_draw.hpp )。這應該有助於與您自己的項目進行部署和集成。您所要做的就是#include庫中的庫文件之一,並在該文件中定義DEBUG_DRAW_IMPLEMENTATION以生成實現。您還可以在其他地方包含圖書館。當未定義DEBUG_DRAW_IMPLEMENTATION時,它充當普通的C ++標頭文件。例子:
在my_program.cpp中:
# define DEBUG_DRAW_IMPLEMENTATION
# include " debug_draw.hpp "現在,在my_program.hpp或任何其他標頭或源文件中,您可以將其包含在普通的C ++標頭:
# include " debug_draw.hpp "就是這樣,您現在應該能夠在自己的應用程序中構建調試。
Debug Draw並不是關於覆蓋渲染器API的假設,因此它可以很容易地與Direct3D或OpenGL或您選擇的任何其他渲染引擎集成在一起。所需的只是您為dd::RenderInterface Abstrack類提供實現,該類別為繪製點,線條和角色字形的基本方法提供了調試繪製。以下是dd::RenderInterface的樣子:
class RenderInterface
{
public:
virtual void beginDraw ();
virtual void endDraw ();
virtual GlyphTextureHandle createGlyphTexture ( int width, int height, const void * pixels);
virtual void destroyGlyphTexture (GlyphTextureHandle glyphTex);
virtual void drawPointList ( const DrawVertex * points, int count, bool depthEnabled);
virtual void drawLineList ( const DrawVertex * lines, int count, bool depthEnabled);
virtual void drawGlyphList ( const DrawVertex * glyphs, int count, GlyphTextureHandle glyphTex);
virtual ~RenderInterface () = 0 ;
};並非所有方法都必須實現,而是決定支持哪些功能!查看RenderInterface聲明的源代碼。對每種方法都進行了很好的評論,並描述了您應該實施的預期行為。要使用諸如OpenGL之類的標準API的RenderInterface的參考實現,請參閱此項目中的samples/目錄。
一旦您為渲染器實現了RenderInterface ,開始使用調試繪製之前,您需要做的就是調用dd::initialize()將其傳遞給您的自定義RenderInterface :
MyRenderInterface renderIface;
dd::initialize (&renderIface);但是請注意,調試繪製批次會減少RenderInterface的調用數量,因此繪圖只會在您調用dd::flush()時實際上進行,通常在幀的末端完成,然後再翻轉屏幕緩衝區:
// You only have to pass the current time if you have timed debug
// draws in the queues. Otherwise just omit the argument or pass 0.
dd::flush (getTimeMilliseconds());因此,整體設置應該看起來如下:
class MyRenderInterface : public dd ::RenderInterface
{
// Cherrypick the methods you want to implement or implement them all
...
};
int main ()
{
MyRenderInterface renderIface;
dd::initialize (&renderIface);
while (!quitting)
{
// Any other drawing that you already do
...
// Call any dd:: functions to add debug primitives to the draw queues
...
dd::flush ( getTimeMilliseconds ());
// Swap buffers to present the scene
...
}
dd::shutdown ();
}Debug Draw提供了多個用於庫配置和自定義的編譯器開關。在debug_draw.hpp中查看文檔以獲取所有開關列表以及每個開關的詳細說明。
圖書館的語言要求很少。它的主要目標之一是無痛地整合和便攜。唯一的要求是最新的C ++編譯器,並具有最小的標準庫支持。假定一些C ++ 11功能,例如nullptr和<cstdint> 。樣本包括更重用C ++標準庫,以演示使用線程的調試繪製使用情況。
不使用RTTI和C ++異常,因此您在將庫與禁用這些功能的項目集成在一起時應該沒有問題。
內存足跡也很小,您可以通過預處理器指令管理將內部隊列承諾的內存量。目前,我們僅在庫啟動時分配少量的動態內存,以解壓縮字體字形以用於調試文本繪圖功能以及繪製隊列和庫上下文數據。
默認情況下,Debug Draw將在內部使用靜態全局上下文,從而提供一個不是線程安全的程序風格的API。這是最容易使用和設置的“經典”調試模式,但是該庫還支持其他兩個在編譯時間安全且可配置的模式:
DEBUG_DRAW_PER_THREAD_CONTEXT :如果在實現之前定義了這一點,則庫將使用線程 - 本地上下文而不是全局共享默認值。這允許從不同線程調用庫,因為每個線程都會保留其私人上下文並繪製隊列。此模式提供了相同的公共庫接口,但需要編譯器的TLS(線程本地存儲)支持。
DEBUG_DRAW_EXPLICIT_CONTEXT :如果在實現之前定義了這一點,則庫希望用戶為上下文提供句柄。此模式揭示了dd::ContextHandle類型,並更改庫中的每個功能以將此句柄作為第一個參數。此模式使庫完全無狀態,因此每個調用庫中的渲染線程都可以創建並維護其自己的調試繪製實例。
顯式上下文模式是一種更清潔,更具功能風格的API,應該是新用戶的首選。過程模式仍然保留為與較舊的庫版本兼容的默認模式,但是建議您通過將#define DEBUG_DRAW_EXPLICIT_CONTEXT與DEBUG_DRAW_IMPLEMENTATION一起添加#Debug_draw_draw_explitic_context來使用顯式上下文模式。將來,程序性的狀態API將被貶低,以明確的棄用。
在其中心繪製一個帶有一組坐標軸的盒子:
const ddVec3 boxColor = { 0 . 0f , 0 . 8f , 0 . 8f };
const ddVec3 boxCenter = { 0 . 0f , 0 . 0f , 3 . 0f };
dd::box (boxCenter, boxColor, 1 . 5f , 1 . 5f , 1 . 5f );
dd::cross (boxCenter, 1 . 0f );要可視化矩陣變換,您可以使用dd::axisTriad()將轉換繪製為三個箭頭:
const ddMat4x4 transform = { // The identity matrix
1 . 0f , 0 . 0f , 0 . 0f , 0 . 0f ,
0 . 0f , 1 . 0f , 0 . 0f , 0 . 0f ,
0 . 0f , 0 . 0f , 1 . 0f , 0 . 0f ,
0 . 0f , 0 . 0f , 0 . 0f , 1 . 0f
};
dd::axisTriad (transform, 0 . 3f , 2 . 0f );可以在samples/目錄中找到有關如何與您自己的渲染器集成調試的更複雜的樣本和示例。公共API中提供的每個功能在標題文件中也有很好的記錄。在圖書館導出的每個公共功能的原型之前,您會發現描述性標頭評論。