Я пытаюсь выяснить, почему значение смещения используется в glVertexAttribPointer
не работает, как я ожидаю.
Код доступен по адресу http://glbase.codeplex.com/
Мои данные вершины таковы:
glBase::Vector3 data1[]={
glBase::Vector3(-0.4f,0.8f,-0.0f), //Position
glBase::Vector3(1.0f,0.0f,0.0f), //Color
glBase::Vector3(-.8f,-0.8f,-0.0f), //Position etc
glBase::Vector3(0.0f,1.0f,0.0f),
glBase::Vector3(0.0f,-0.8f,-0.0f),
glBase::Vector3(0.0f,0.0f,1.0f)
};
И привязка атрибута происходит так:
program.bindVertexAttribs<float>(vbo1,0, "in_Position", 3, 6, 0);
program.bindVertexAttribs<float>(vbo1,1, "in_Color", 3, 6, 12);
Функция bindVertexAttribs определяется следующим образом:
template<typename T>
void bindVertexAttribs(const VertexBufferObject& object, GLint location,const std::string& name, unsigned int width, unsigned int stride, unsigned int offset)
{
object.bind();
glBindAttribLocation(m_ID, location, name.c_str());
glVertexAttribPointer(location, width, GL_FLOAT, GL_FALSE, stride*sizeof(T),(GLvoid *)offset);
glEnableVertexAttribArray(location);
}
Этот код некорректно отображается на моей машине (драйверы ATI 5850,12.10) и отображает следующее:
Если я изменю привязку атрибута к:
program.bindVertexAttribs<float>(vbo1,0, "in_Position", 3, 6, 12);
program.bindVertexAttribs<float>(vbo1,1, "in_Color", 3, 6, 0);
Я получаю правильный рендер, как это:
Это не имеет смысла для меня, поскольку позиция — это первые 3 числа с плавающей точкой в массиве данных, а цвет — следующие три числа с плавающей точкой, затем позиция снова и так далее. Я что-то упускаю из виду?
glBindAttribLocation(m_ID, location, name.c_str());
Это ничего не делает; не стесняйтесь удалить эту строку, чтобы увидеть, сколько она ничего не делает.
Если m_ID
является связанным программным объектом (и если это не так, то ваш код имеет еще меньше смысла. Если только вы не используете VAO для захвата состояния массива атрибутов), тогда эта функция не будет иметь реального эффекта. glBindAttribLocation
только работает перед связыванием. Вы не можете изменить привязку атрибута после ссылки. Таким образом, каждый объект, который использует программу, должен использовать так же атрибутов.
Вам следует установить правильное соглашение для ваших имен атрибутов вершин. Когда вы создаете какую-либо программу, вы должны применить свое соглашение к программе перед установкой ссылки. Таким образом, вы знаете, что in_position
всегда атрибут 0, например. Вам не придется искать это с бессмысленным glGetAttribLocation
вызов. И у вас не будет соблазна сделать то, что вы делаете здесь, что не работает.
Других решений пока нет …