2011-05-21 22 views

回答

3

Christian Rau觸及正確的主題。

glGenLists保證返回值的排序的原因是字符串繪製。使用模型想glListBase + glCallLists允許簡單

// ascii model 
// init 
asciiBase = glGenLists(128); 
// usage 
glListBase(asciiBase); 
glCallList(strlen(string), GL_UNSIGNED_BYTE, string); 

對於使用模型,你真正需要的範圍內是連續的。沒有爲紋理設想這樣的模型,因此取消了連續名稱的要求,因爲它簡化了GL的實現。

作爲一個額外的消息,請注意glGen *調用都是可選的。沒有什麼能阻止你做:

glBindTexture(GL_TEXTURE_2D, 5); 
// never called glGenTextures to get that 5!!! 
+0

讓我補充一點,你最後的評論(用數字直接,沒有glGen ......呼叫)只能在預GL3/4上下文或兼容性配置文件。由於新的核心配置文件要求您使用glGen ...來創建對象。我想,這樣可以在獲取名稱時創建對象,而不是在第一次調用綁定時創建對象。 – 2011-05-21 18:52:26

+0

@ChristianRau:是的。還有一個額外的(大的)優勢,即GL不必知道如何處理任意名稱。句柄可以是實際對象的單一間接,而不是需要地圖或這種結構的任意鍵。 – Bahbar 2012-12-04 08:24:17

2

我認爲glGenLists直接返回更多的是過去的殘留。 glGenTextures使用指針的原因是您可以獲取多個紋理名稱。但對於不必要的glGenLists,因爲通過對glGenLists(n)的單個調用生成的n個列表ID保證具有連續的值,因此可以有效地使用glCallLists和glListBase。所以你只需要知道第一個值。

但紋理ID不保證有這個屬性,所以你需要所有的n值,因此數組。我想當介紹紋理對象(它們出現在顯示列表之後)時,他們意識到這個調用更爲普遍,因爲現在你沒有實現保證連續的紋理ID(這也沒有任何優勢)。