2015-01-05 2 views
4
GLuint b; 
glGenBuffers(1,&b); 
glBindBuffer(GL_ARRAY_BUFFER,b); 
glBufferData(GL_ARRAY_BUFFER,...); 

Я думаю, что это станетМожно ли эмулировать прямой доступ к государству?

GLuint b; 
glCreateBuffers(1,&b); 
glBufferData(b,...); 

Теперь нет необходимости для целей типа «GL_ARRAY_BUFFER» больше. Но как я тогда подражать этому < 4.5?

Могу ли я просто привязать «все» к GL_ARRAY_BUFFER за кулисами?

glBufferDataDSA(GLuint b,...){ 
    glBindBuffer(GL_ARRAY_BUFFER,b); 
    glBufferData(GL_ARRAY_BUFFER,...); 
    glBindBuffer(GL_ARRAY_BUFFER,0); 
} 

Я имею в виду, что это не должно повлиять на то, что я связываю, если я всегда обязательно установлю привязку.

Или у меня возникнут проблемы, если я попытаюсь подражать DSA, как это?

ответ

3

Это не правильный вызов:

GLuint b; 
glCreateBuffers(1,&b); 
glBufferData(b,...); 

glBufferData() не перегружен взять имя буфера аргумент. Существует новый glNamedBufferData() вызов для случая DSA:

GLuint b; 
glCreateBuffers(1,&b); 
glNamedBufferData(b,...); 

Ваша замена не-АСС выглядит отлично, кроме очевидного побочного эффекта, что вы уже знаете. Разумеется, он изменит текущую привязку GL_ARRAY_BUFFER. Если вас это не волнует, последовательность кода должна быть эквивалентной. Вероятно, нет необходимости устанавливать привязку к 0 в конце, так как вы все равно потеряли предыдущее связывание и всегда должны связывать буфер перед его использованием.

В целом, я не думаю, что DSA действительно добавляет новые функциональные возможности, поэтому его можно эмулировать без вызовов DSA без особых проблем. Это всего лишь новый набор точек входа API для существующих функций, которые, согласно некоторым утверждениям, должны быть более эффективными.

+2

самая большая боль с эмуляцией DSA восстанавливает состояние, поэтому код, не поддерживающий DSA, не прерывается. –

+0

@ratchetfreak: Я обнаружил, что использование схемы, подобной RAII, действительно помогает в этом. Я создаю серию объектов в начале моей поддельной реализации DSA, которая инкапсулирует селектор, заявляет изменения вызова функции, и когда эти объекты уничтожаются (выходят за рамки), они автоматически восстанавливают состояние. Это немного менее уродливо, чем необходимость запоминать его самостоятельно для каждого возможного пути управления в функции DSA, которую вы пытаетесь реализовать. DSA *** *** *** в GL 4.5, но это будут годы и годы, прежде чем это означает, что он широко доступен, поэтому эти хаки остаются необходимыми: - \ –