可能是一點OCD,但我覺得很煩人,在OpenGL中,glGenLists
直接返回列表ID,而glGenTextures
使用參考參數來反饋ID。爲什麼glGenLists直接返回值,而glGenTextures使用參考參數?
GLuint glGenLists(GLsizei range);
void glGenTextures(GLsizei n, GLuint * textures);
是否有此不一致的背後有什麼好的原因是什麼?
可能是一點OCD,但我覺得很煩人,在OpenGL中,glGenLists
直接返回列表ID,而glGenTextures
使用參考參數來反饋ID。爲什麼glGenLists直接返回值,而glGenTextures使用參考參數?
GLuint glGenLists(GLsizei range);
void glGenTextures(GLsizei n, GLuint * textures);
是否有此不一致的背後有什麼好的原因是什麼?
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!!!
我認爲glGenLists直接返回更多的是過去的殘留。 glGenTextures使用指針的原因是您可以獲取多個紋理名稱。但對於不必要的glGenLists,因爲通過對glGenLists(n)的單個調用生成的n個列表ID保證具有連續的值,因此可以有效地使用glCallLists和glListBase。所以你只需要知道第一個值。
但紋理ID不保證有這個屬性,所以你需要所有的n值,因此數組。我想當介紹紋理對象(它們出現在顯示列表之後)時,他們意識到這個調用更爲普遍,因爲現在你沒有實現保證連續的紋理ID(這也沒有任何優勢)。
讓我補充一點,你最後的評論(用數字直接,沒有glGen ......呼叫)只能在預GL3/4上下文或兼容性配置文件。由於新的核心配置文件要求您使用glGen ...來創建對象。我想,這樣可以在獲取名稱時創建對象,而不是在第一次調用綁定時創建對象。 – 2011-05-21 18:52:26
@ChristianRau:是的。還有一個額外的(大的)優勢,即GL不必知道如何處理任意名稱。句柄可以是實際對象的單一間接,而不是需要地圖或這種結構的任意鍵。 – Bahbar 2012-12-04 08:24:17