Я работаю над загрузчиком .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));
Большое спасибо за ваш ответ tommy, вы предлагаете мне просто создать массив 'GLuint' для индексов? смысл без использования структуры Face3D и просто добавления их один за другим? будет openGL знать, как отделить x, y, z? я имею в виду, что я иду на 1,2,3 и т. д. – Itzik984
И btw, я только что проверил и действительно 'sizeof (struct Face3D) == sizeof (GLuint) * 3', но теперь я получаю только половину obj рисунка. С этим нелегко справиться! – Itzik984
Чтобы быть полностью безопасным, вы должны десериализовать структурированные данные в необработанные массивы для преимуществ OpenGL. Просто напишите свою собственную оболочку для 'glBufferData', что' malloc 'соответствует размеру массива, итерации через структуры, чтобы заполнить массив, а затем отправляет массив через' glBufferData'. – Tommy