Атрибут вершины Opengl шаг - PullRequest
7 голосов
/ 27 ноября 2010

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

struct SVertex
{
    float x,y,z;
    float nx,ny,nz;
    float tx,ty,tz;
    float bx,by,bz;
    float tu1,tv1;
    float tu2,tv2;
};

Затем я использовал «glVertexAttribPointer (index, 3, GL_FLOAT, GL_FALSE, stride, v);» указать на массив вершин. Индекс является одним из атрибутов, которые я хочу использовать, и все остальное в порядке, кроме шага. Это сработало, прежде чем я решил добавить это в уравнение. Я прошел шаг как sizeof (SVertex) и как 13 * 4, но ни один из них, похоже, не работает.
Если это имеет какое-то значение, я рисую такие примитивы

glDrawElements(GL_TRIANGLES,surface->GetIndexCount()/3,GL_UNSIGNED_INT,surface->IndPtr());
В спецификациях OpenGL написано, что шаг должен быть размером в байтах от конца атрибута (в данном случае z) до следующего атрибута того же вида (в данном случае x). Так что по моим расчетам это должно быть 13 (nx, ny, nz, tx, ty .... tuv2, tv2) умножить на 4 (размер с плавающей точкой).
Ох, и еще одна вещь, что дисплей просто пуст.
Может ли кто-нибудь помочь мне с этим?
Большое спасибо.

Ответы [ 2 ]

6 голосов
/ 27 ноября 2010

Если у вас есть такая структура, то stride - это просто sizeof SVertex, и она одинакова для каждого атрибута. Здесь нет ничего сложного.

Если это не сработало, поищите ошибку где-нибудь еще.

Например, здесь:

surface->GetIndexCount()/3

Этот параметр должен быть количество вершин, а не примитивов , которые нужно отправить - следовательно, я бы сказал, что это деление на три неверно Оставьте это как:

surface->GetIndexCount()

2 голосов
/ 27 ноября 2010

Тогда я использовал "GlVertexAttribPointer (индекс, 3, GL_FLOAT, GL_FALSE, шаг, v);" указать на массив вершин. Индекс является одним из атрибута I хочу использовать и все остальное в порядке кроме шага

Это не работает для texcoord (у вас есть 2x 2 или 1x 4 числа).

По поводу шага, как сказал Кос, я думаю, вам следует пройти шаг 16 * sizeof(float) (размер вашего SVertex).

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

x, y, z в порядке, но nx и ny самодостаточны, если ваши нормали нормализованы (что может быть так). Вы можете извлечь в вершинный шейдер nz (при условии, что у вас есть возможности шейдера). То же самое относится к tx и ty. Вам вообще не нужен bx, by, bz, поскольку вы знаете, что это перекрестное произведение normal и tangent.

struct SPackedVertex
{
    float x,y,z,w;       //pack all on vector4
    float nx,ny,tx,ty;
    float tu1,tv1;tu2,tv2;
};
...