2014-02-19 2 views
0

Я работаю над загрузчиком .obj для своего приложения, и для этого я устанавливаю массив индексов и массив вершин и запускаю их во время выполнения.Настройка массива индексов и вершин openGL ES

Это, как определены Структуры:

typedef struct { 
    float Position[3]; 
    float Color[4]; 
    float TexCoord[2]; 
} Vertex; 

typedef struct { 
    GLuint v1; 
    GLuint v2; 
    GLuint v3; 
} Face3D; 

и это, как массивы в файле .h:

Vertex* VerticesArr; 
Face3D* Faces; 

Но когда я инициализировать их, я не вижу ничего на мой в отличие от использования этого способа:

const Vertex Vertices[] = { 
    {{1, -1, 0}, {1, 0, 0, 1},{0,0}}, 
    {{1, 1, 0}, {0, 1, 0, 1},{0,0}}, 
    {{-1, 1, 0}, {0, 0, 1, 1},{0,0}}, 
    {{-1, -1, 0}, {0, 0, 0, 1},{0,0}} 
}; 

const GLubyte Indices[] = { 
    0, 1, 2, 
    2, 3, 0 
}; 

, используя эти массивы const, я получаю рисунок на экране.

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

Это, как я настроить мои VBÖ на обоих направлениях представлены ранее:

- (void)setupVBOs { 

    GLuint vertexBuffer; 
    glGenBuffers(1, &vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(VerticesArr), VerticesArr, GL_STATIC_DRAW); 

    GLuint indexBuffer; 
    glGenBuffers(1, &indexBuffer); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Faces), Faces, GL_STATIC_DRAW); 

} 

и способ я использую рисовать элементы:

glDrawElements(GL_POINTS, sizeof(Faces)/sizeof(Faces[0]), GL_UNSIGNED_INT, 0); 

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

Это, как я выделить место для них:

// Allocate space for the Vertices array 
NSLog(@"Size of vertice is: %lu",sizeof(Vertex)); 
VerticesArr = (Vertex*)(malloc(sizeof(Vertex) * vertexCombinations.count)); 
// Allocate space for the Faces 
NSLog(@"Size of face is: %lu",sizeof(Face3D)); 
Faces = (Face3D*)(malloc(sizeof(Face3D)*faceCount)); 

ответ

1

Потенциальные проблемы:

1) C не гарантирует плотную упаковку структур. Так, например, компилятор может посмотреть на ваш Face3D, то есть на 12 байтов и решите поместить его в 16 байт - каждая структура будет иметь четыре неиспользуемых байта в конце, потому что это может ускорить чтение отдельных структур. Точно так же он оставляет за собой право прокладывать между отдельными элементами в структуре. Вы используете единицы из натурального размера, поэтому заполнение не обязательно вероятно, но ваш компилятор оставляет за собой право добавить его и полагаться на жесткие средства упаковки, полагаясь на неопределенное поведение.

2) sizeof(Faces)/sizeof(Faces[0]) - sizeof(struct Face3D) - это совсем другое количество от sizeof(GLuint), так что даже если ваши структуры плотно упакованы, это разница между двумя вашими частями кода.

Вы можете проверить, есть ли sizeof(struct Face3D) == sizeof(GLuint)*3 и эквивалентный тест в другом месте во время выполнения. Если это так, вы можете передать структуру напрямую на glBufferData. Если нет, вы можете просто пройти соответствующий шаг с glVertexAttribPointer в зависимости от точного заполнения, но, скорее всего, вам понадобится явно сериализовать неструктурированный массив для преимуществ OpenGL.

+0

Большое спасибо за ваш ответ tommy, вы предлагаете мне просто создать массив 'GLuint' для индексов? смысл без использования структуры Face3D и просто добавления их один за другим? будет openGL знать, как отделить x, y, z? я имею в виду, что я иду на 1,2,3 и т. д. – Itzik984

+0

И btw, я только что проверил и действительно 'sizeof (struct Face3D) == sizeof (GLuint) * 3', но теперь я получаю только половину obj рисунка. С этим нелегко справиться! – Itzik984

+1

Чтобы быть полностью безопасным, вы должны десериализовать структурированные данные в необработанные массивы для преимуществ OpenGL. Просто напишите свою собственную оболочку для 'glBufferData', что' malloc 'соответствует размеру массива, итерации через структуры, чтобы заполнить массив, а затем отправляет массив через' glBufferData'. – Tommy

2

Первая проблема, которую я вижу в этой части кода:

- (void)setupVBOs { 

    GLuint vertexBuffer; 
    glGenBuffers(1, &vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(VerticesArr), VerticesArr, GL_STATIC_DRAW); 

    GLuint indexBuffer; 
    glGenBuffers(1, &indexBuffer); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Faces), Faces, GL_STATIC_DRAW); 

} 

При создании постоянного массива sizeof(Faces) будет возвращать размер вашего массива, но когда вы динамически выделять их тогда sizeof(Faces) будет размер указателя (обычно 4 байта). Вторая проблема, которую я вижу, заключается в том, что во время статического распределения ваши индексы - GLUByte, но в Face3D - GLUInt.Не уверен, что это проблема, но похоже, что это может быть.

+0

Вы были прав насчет размера 'Faces', то же самое касается размера' VerticesArr' ... теперь я получаю рисунки, но только наполовину модель. получили подсказки о том, где начать отлаживать это? – Itzik984

+0

Ничего, получилось :) спасибо! – Itzik984

 Смежные вопросы

  • Нет связанных вопросов^_^