OpenGL 4.6 без glBind: Direct State Access на C++23
The article looks at using OpenGL 4.6's Direct State Access with C++23 as a way to avoid glBind. It uses glBufferData as an example: the call takes GL_ARRAY_BUFFER rather than a buffer, and changes whatever buffer someone previously bound to that slot. That binding could have happened on an earlier line, in another function, or in another file. The article notes that the 'bind first, then change' rule is central to many well-known OpenGL tutorials.
Попробуйте найти в этой строке буфер, который она изменит: glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); Буфера в строке нет. Функция получает название гнезда GL_ARRAY_BUFFER и меняет тот буфер, который кто-то привязал к гнезду раньше: может быть, строкой выше, а может быть, в другой функции и в другом файле. На правиле «сначала привяжи, потом меняй» построены самые известные учебники OpenGL, потому что они рассчитаны на версию 3.3. На том же правиле держатся ошибки, о которых OpenGL не сообщает: настройка молча попадает не в тот объект. Начиная с OpenGL 4.5 привязывать объект ради настройки не нужно. В стандарт вошёл Direct State Access, сокращённо DSA: функции, которые получают объект первым аргументом. В статье я соберу на DSA квадрат с текстурой и индексами без единого glBindBuffer и glBindTexture и покажу на схемах, что при этом происходит внутри OpenGL. Код написан на C++23: к месту оказались std::expected , std::print , std::mdspan и новые диапазоны. Весь код статьи собран компилятором MSVC из Visual Studio 2026 с флагом /W4 без предупреждений и запущен на OpenGL 4.6. Вот что рисует программа: Читать далее