Смещение атрибута OpenGL не работает должным образом

Я пытаюсь выяснить, почему значение смещения используется в 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 числа с плавающей точкой в ​​массиве данных, а цвет — следующие три числа с плавающей точкой, затем позиция снова и так далее. Я что-то упускаю из виду?

1

Решение

glBindAttribLocation(m_ID, location, name.c_str());

Это ничего не делает; не стесняйтесь удалить эту строку, чтобы увидеть, сколько она ничего не делает.

Если m_ID является связанным программным объектом (и если это не так, то ваш код имеет еще меньше смысла. Если только вы не используете VAO для захвата состояния массива атрибутов), тогда эта функция не будет иметь реального эффекта. glBindAttribLocation только работает перед связыванием. Вы не можете изменить привязку атрибута после ссылки. Таким образом, каждый объект, который использует программу, должен использовать так же атрибутов.

Вам следует установить правильное соглашение для ваших имен атрибутов вершин. Когда вы создаете какую-либо программу, вы должны применить свое соглашение к программе перед установкой ссылки. Таким образом, вы знаете, что in_position всегда атрибут 0, например. Вам не придется искать это с бессмысленным glGetAttribLocation вызов. И у вас не будет соблазна сделать то, что вы делаете здесь, что не работает.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]