2010-11-27 4 views
7

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

 
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 (индекс, 3, GL_FLOAT, GL_FALSE, шаг, 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 (размер поплавка).
О, и еще одно, что дисплей просто пуст.
Может ли кто-нибудь помочь мне в этом?
Большое спасибо.

+1

Я сказал, что 13 значений мышления я должен вычесть первые 3 (если у вас есть только x, y, z, то шаг равен 0); – Sanctus2099 2010-11-27 11:04:56

ответ

6

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

Если это не помогло, найдите свою ошибку в другом месте.

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

surface->GetIndexCount()/3

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

surface->GetIndexCount()

+1

Спасибо. Это был индекс. Хотя, если вы посмотрите на спецификации Ogl « count-Указывает количество элементов, которые будут отображаться». – Sanctus2099 2010-11-27 11:20:15

+0

Я считаю, что спецификация означает, что «элемент» такой же, как «вершина» в этом контексте. Линии, треугольники, квадрациклы, многоугольники и т. Д. Вместе называются «примитивами». – Kos 2010-11-27 11:24:38

2

Тогда я использовал "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; 
};