很多人似乎認爲圖形不受傳統TDD /單元測試的影響。這是不正確的。
圍繞TDD的問題是,圖像不會總是正好是一樣的。比如抗鋸齒設置(可以被驅動程序設置覆蓋)。不同GPU之間渲染同一圖像的差異(多邊形展開順序等)。同樣,當你的遊戲經歷發展時,像網格和紋理可能會改變或調整。
也有人認爲你經常需要做它,並在看到它之前,眼球的結果,如果它確定,然後將其添加爲通過測試用例(這將由於上述問題將打破)。
你可以將所有的OpenGL調用與日誌記錄包裝在一起,並確保所有的東西都按預期調用,但是這並不測試圖形實際上是否有效,它只是測試你的程序正在調用你預測它應該使。這不是非常有用,而且會有相當多的工作。此外,如果您需要優化不必要的繪圖調用等操作,將會很難維護。
我建議做的是將您的渲染輸出與窗口系統分離。我的意思是'Render to Texture'或使用FrameBuffer對象。這也有助於實現諸如視口和UI/HUD疊加等功能。
製作一個'窗口'對象。使用Qt,SDL,SFML,GLUT或其他方式打開實際桌面窗口的東西。並將某種渲染器傳遞給它。你可以做一些事情,比如允許多個渲染器並指定矩形座標(你可以在屏幕的角落渲染不同的視圖)。或者可以創建一個主渲染器,但可以繼承允許其擁有子渲染器的版本。 Window對象也可以處理輸入,這提供了一個注入假/模擬輸入對象的好方法,您可以測試玩家是否按預期向前移動。
這種模塊化方法就是那種不屬於TDD的東西,它也可以讓你的渲染器擁有自己的渲染器(也許你想單獨做一個天空盒,或者在遊戲中安全監視器上的圖片,反射,shadowmaps等)。您還可以輕鬆地以不同的分辨率渲染原生桌面(這對於在TDD中設置固定分辨率非常有用,對於簡單操作可能只是32x32之類的東西,但對於分辨率固定的Android等設備也很有用) GPU具有不同的功能,Nexus 10不足以讓你的遊戲在其XDPI上呈現出來嗎?縮小尺寸也有助於Linux/Xorg,它並不總能讓你設置GPU的所有分辨率,儘管現在這個問題不大)。
一旦你有了你的FBO,做一些函數來查詢像素顏色。然後你可以查詢你所有的基本操作。你的網格物體是否正確渲染?測試它。用一個白色的三角形做網格,並查詢你希望看到哪些位置是白色的,以及繪製該三角形時應該保持黑色。 1x1窗口中的1x1三角形應該覆蓋%50對角線,因此測試像素靠近邊緣和中間的兩側,窗口邊界和尖角位。接下來combine two triangles into a rectangle它應該填滿屏幕,現在所有的像素都應該是白色的。現在嘗試將它從相機移開,並檢查邊框是黑色的,但中心是白色的,1.0x1.0窗口中的1.0x1.0矩形位於1.0處,您可以應用一些簡單的幾何圖形來近似查看邊框的位置應該結束。 Test with a different color。用多色立方體制作更復雜的網格並測試旋轉。製作測試法線貼圖。
您可能可以通過渲染一個球體來檢測燈光,並檢查左側的光線是否比右側亮,如果在另一側添加另一個燈光,它們大致相同(只需將所有像素添加到左側和右側的所有像素,並在誤差範圍內進行比較)。增加光線亮度並查看像素總和是否增加。您可以通過在平面上的特定點處計算預期顏色來測試照明算法。 您可以看到,光譜突出顯示在預期區域最亮。爲您的正常/凹凸映射make a test texture。
只是爲了避免任何真正具體的東西,例如,不要在邊緣完全測試。他們可能會反抗或輕微關閉。如果您正在測試照明的左/右亮度,不要指望像素數量在不同系統或甚至兩側(在對稱場景中)都是相同的數字,請使用誤差範圍。不要使用真實數據,請確保使用不會更改的基本「測試」紋理和網格。