glGen * против glCreate * соглашение об именовании

#opengl

#opengl

Вопрос:

Я просмотрел стандарты OpenGL в поисках объяснения этого… почему некоторые объекты (шейдерные объекты) используют функции, начинающиеся с префикса glCreate, а некоторые объекты (буферные объекты) используют функции, начинающиеся с префикса glGen? Есть ли для этого семантическая причина?

Ответ №1:

glGen… Функции восходят к OpenGL-1.1 ( glGenTextures ) и используются для создания имен объектов без фактической инициализации объекта. Однако в большинстве случаев эти функции используются для создания только одного имени объекта за раз. Таким образом, вместо того, чтобы передавать им указатель на буфер и размер буфера, вы могли бы большую часть времени просто возвращать одно целое число.

Когда 3Dlabs представила GLSL, они попытались порвать со старым glGen… соглашением, чтобы модернизировать OpenGL API.

Да, это немного несущественно, и, честно говоря, я бы предпочел, чтобы GLSL API использовал соглашение об glGen… именовании. Но мы застряли с glCreateShader and glCreateProgram и все.

Если вы хотите иметь единое соглашение об именовании, вы можете написать следующие оболочки:

 GLuint glCreateTexture(void) { GLuint name; glGenTextures(1, amp;name); return name; }
GLuint glCreateBuffer(void) { GLuint name; glGenTextures(1, amp;name); return name; }
...
  

Комментарии:

1. интересно, еще одна причина не покупать карты 3dlabs (jk)… теперь, когда вы упомянули об этом, тот факт, что эти функции ВОЗВРАЩАЮТ значения, также является частью старого когнитивного диссонанса.

2. хм, я вижу, что WebGL движется в том же направлении, выбирая gl.createBuffer() вместо более традиционного gl.genBuffers()

3. Этот ответ определенно мог бы использовать обновление для OpenGL 4.5 и direct_state_access, поскольку теперь у нас есть как glGenTextures, так и glCreateTextures, среди прочих.

4. @Jagoly: Вроде того. К сожалению, glCreateTextures вводит еще одну семантику API; он ближе к glGenTextures, чем glCreate{Program,Shader}, из-за возврата массива текстур в буфер, предоставленный пользователем (в отличие от glCreate{Program, Shader}, который предоставляет фактическое имя объекта в качестве возвращаемого значения функции). Давайте, ребята, решайтесь…

5. @RobertWang: Соглашения об именовании API на самом деле не являются предложением. Но методы DSA как бы выстраивают «старые вещи» в ряд с API более новых вещей. Основное преимущество DSA заключается в том, что при 100% кодовой базе DSA (которую на сегодняшний день вряд ли можно найти, поскольку DSA является довольно новой разработкой) вам больше не нужно заботиться о глобальном состоянии… что упрощает многое. Если вы добавите в микс текстуры без привязки, вы получите довольно близкое к тому, что у вас есть с Vulkan, D3D12 или Metal.

Ответ №2:

Начиная с OpenGL 4.5, я понимаю, что функции glCreate * обычно предназначены для использования с функциями прямого доступа к состоянию, представленными в OpenGL 4.5, тогда как glGen * требуют привязки соответствующего буфера, массива, текстуры и т.д., прежде чем их можно будет использовать, поскольку до этого они неинициализированы.

например, из https://www.opengl.org/sdk/docs/man4/html /

glGenVertexArrays (…) Имена, возвращаемые в массивах, помечаются как используемые только для целей glGenVertexArrays, но они приобретают состояние и тип только при первом привязке.

glCreateVertexArrays возвращает n ранее неиспользуемых имен объектов массива вершин в массивах, каждое из которых представляет новый объект массива вершин, инициализированный в состояние по умолчанию.

Можно утверждать, что glCreateProgram тоже имеет смысл. Если он создает инициализированный объект, он соответствует остальной части синтаксиса.