對不起,因爲我是遊戲編程的新手。我一直在看一些開源項目,並注意到一些精靈分成幾個文件,所有這些文件都組合在一起,使2d對象看起來像動畫。這很簡單。然後我會看到一種不同的方法,將2d對象全部放在一個PNG文件中或類似的東西上,全部相鄰。遊戲編程中的精靈,多個文件與一個「紋理」?
對另一種方法使用一種方法是否有優勢?精靈應該放在不同的文件中嗎?爲什麼他們有時都在一張紙上?
對不起,因爲我是遊戲編程的新手。我一直在看一些開源項目,並注意到一些精靈分成幾個文件,所有這些文件都組合在一起,使2d對象看起來像動畫。這很簡單。然後我會看到一種不同的方法,將2d對象全部放在一個PNG文件中或類似的東西上,全部相鄰。遊戲編程中的精靈,多個文件與一個「紋理」?
對另一種方法使用一種方法是否有優勢?精靈應該放在不同的文件中嗎?爲什麼他們有時都在一張紙上?
前一種方法通常更簡單,易於編程,讓你在開源項目中看到了很多。
第二種方法是對現代圖形硬件效率更高,因爲它允許用戶從一個大的紋理通過指定不同的U繪製多個不同的精靈,V座標來選擇從上述複合片每個單獨的子畫面。因爲u,v座標可以與頂點數據一起傳輸到着色器,所以這可以使您比每個多邊形切換紋理(這意味着更改着色器狀態)的效率更高,可以更有效地繪製大量的子畫面。這意味着您可以每毫秒繪製更多精靈,從而在屏幕上獲得更多精靈。
您打開當前綁定的紋理每次(如果系統運行的內存,並開始分頁紋理進出有時一個非常大的一個),你招致處罰。所以用一個紋理繪製的東西越多越好。走極端的話,如果你從來沒有換過紋理綁定,你會受到0點懲罰。
在另一方面,視頻卡限制紋理的最大尺寸,所以你只能組更小的紋理成一個大這麼多。卡越老,可以使用的紋理尺寸越小。所以如果你想讓你的遊戲在各種各樣的卡片上工作,你必須限制你的紋理到一個更正常的大小(或者對不同的卡片有不同的紋理組合)。
的另一個問題是,有時在你的虛擬世界中的東西只是本身不屬於被分組這樣。雖然你的UI可以有很大的紋理(窗口框架,按鈕等),但是對於不同的敵人使用單一紋理會更困難,因爲它們甚至可能不會出現在屏幕上同時,或者您可能無法一個接一個地繪製它們,因爲透明度所需的背對背繪圖方案。
不久前一個理由使用包裝的精靈,而不是單獨的人是圖形硬件僅限於冪的兩個紋理(256,512,1024,...)。因此,如果不上傳精靈,你就不會將精靈放大,因爲你不得不將所有東西都放大到兩個維度。將多個精靈包裝成一個紋理。
另一個原因是它從HD載入一個大圖像文件要快得多,然後載入數百個小圖像文件。這仍然是一種情況,因爲文件訪問每個文件都有相當大的開銷,所以文件越少,事情就越快。特別是對於小精靈,您可以輕鬆地將數百個文件轉換爲單個文件,因此節省可能非常明顯。
然而,也有理由反對在一個紋理中擁有一切。對於一個OpenGL不再侷限於兩個冪次紋理,所以任何大小都可以工作。但更重要的是,將所有東西都包裝在一個紋理中會產生負面影響。例如,當你在遊戲中有很多縮放比例時,你必須小心你的精靈邊界,因爲顏色會融入相鄰的精靈中,給你帶來醜陋的文物。你可以通過在你的精靈周圍增加額外空間來避免這種情況,但它不是一個完美的解決方案。將所有東西放在一個紋理中也會限制您可以對圖像執行的操作。對於某些效果(例如瀑布),您可能希望通過簡單地偏移紋理的UV座標來執行動畫,但當將所有內容都打包到單個紋理中時,您無法如此輕鬆地完成該動畫。
雖然GL接受API中的任何大小的紋理,但硬件並不一定支持它;大多數驅動程序會將「pow2」的非pow2紋理(或「內部」下的某個倍數)填充到「引擎蓋下」。 – Crashworks 2009-09-23 00:35:58
upvote提及負面影響! – sjkm 2015-11-11 13:26:38
嘿crashworks謝謝你的迴應。有關新手可以學習更多關於u,v座標,着色器等內容的任何建議? – randombits 2009-09-21 04:01:51
請嘗試http://nehe.gamedev.net/ – Crashworks 2009-09-21 04:04:33
@randombits,Wikipedia。 – 2009-09-21 04:05:06