2015-01-06 5 views
2

Теперь, когда у нас есть прямой доступ к состоянию, я удивляюсь, почему нет обновленных функций DSA glDraw *.Доступ к прямому доступу для рисования * функций?

Например, glDrawArrays зависит от текущего VAO, поэтому почему нет glNamedDrawArrays?

У меня все еще есть вызов

glBindVertexArray(vao); 
glDrawArrays(..); 

или есть другой способ?

+3

Я думаю, вы можете быть более здравомыслящие DSA. Если вы хотите реализовать команду рисования с нулевыми побочными эффектами, ей также нужно будет взять дескриптор программы GLSL для использования, чтобы вам также не пришлось вызывать 'glUseProgram (...)', массив текстур для привязки для каждого блока изображения и так далее. DSA больше подходит для изменения состояний объектов без привязки указанного объекта. –

ответ

6

glDraw * просто скажите OGL, чтобы нарисовать что-то в текущем контексте и что, возможно, связано со многими состояниями, такими как Shader, Blender, VBO/VAO, Z/Stencil, Texture и т. Д. Даже небольшое изменение может привести к другому результату рендеринга, так что вы можете создать изображение DSA glDraw * будет длинным списком параметров функций, это нехорошо. Например, вы хотите изменить cull face с CW на CCW, возможно, вам нужно найти соответствующий параметр в длинном вызове функции и изменить его. Следует отметить, что OGL является наиболее похожим на C, а функция параметров по умолчанию ограничена, каждый раз, когда вы вызываете DSA glDraw *, вам нужно иметь длинный вызов функции с самыми близкими значениями, что сделает вас сумасшедшими.

Как пояснил Энден М. Коулман, DSA направлена ​​на сокращение последовательности вызовов общей функции вызова функции OGL: bind-> modify-> unbind, а DSA требуется только 1 вызов API. Это уменьшит время процессора, особенно у вас очень большие вызовы API OGL.

Благодаря

+0

Многопараметрические функции не являются оправданием: никто не мешает вам передать структуру в качестве параметра, возможно, ее инициализировать с помощью некоторой функции «glInitState». – Ruslan

+0

такая «структура» уже придумана как контекст OGL;;) –

+0

Разница между контекстом OGL и этой структурой заключается в том, что различные потоки смогут передавать свои структуры в функции API без каких-либо блокировок, в то время как контекст обычно используется совместно (в противном случае вам придется дублировать ресурсы). – Ruslan

Смежные вопросы