Draw Sphere - порядок вершин
Я хотел бы нарисовать сферу в чистом OpenGL ES 2.0 без каких-либо движков. Я пишу следующий код:
int GenerateSphere (int Slices, float radius, GLfloat **vertices, GLfloat **colors) {
srand(time(NULL));
int i=0, j = 0;
int Parallels = Slices ;
float tempColor = 0.0f;
int VerticesCount = ( Parallels + 1 ) * ( Slices + 1 );
float angleStep = (2.0f * M_PI) / ((float) Slices);
// Allocate memory for buffers
if ( vertices != NULL ) {
*vertices = malloc ( sizeof(GLfloat) * 3 * VerticesCount );
}
if ( colors != NULL) {
*colors = malloc( sizeof(GLfloat) * 4 * VerticesCount);
}
for ( i = 0; i < Parallels+1; i++ ) {
for ( j = 0; j < Slices+1 ; j++ ) {
int vertex = ( i * (Slices + 1) + j ) * 3;
(*vertices)[vertex + 0] = radius * sinf ( angleStep * (float)i ) *
sinf ( angleStep * (float)j );
(*vertices)[vertex + 1] = radius * cosf ( angleStep * (float)i );
(*vertices)[vertex + 2] = radius * sinf ( angleStep * (float)i ) *
cosf ( angleStep * (float)j );
if ( colors ) {
int colorIndex = ( i * (Slices + 1) + j ) * 4;
tempColor = (float)(rand()%100)/100.0f;
(*colors)[colorIndex + 0] = 0.0f;
(*colors)[colorIndex + 1] = 0.0f;
(*colors)[colorIndex + 2] = 0.0f;
(*colors)[colorIndex + (rand()%4)] = tempColor;
(*colors)[colorIndex + 3] = 1.0f;
}
}
}
return VerticesCount;
}
Я рисую это с помощью следующего кода:
glDrawArrays(GL_TRIANGLE_STRIP, 0, userData->numVertices);
Где userData->numVertices - VerticesCount из функции GenerateSphere. Но на экране рисует ряд треугольников, это не сферное приближение! Я думаю, мне нужно нумеровать вершины и использовать функцию OpenDGL ES 2.0 glDrawElements() (с массивом, содержащим число вершин). Но серия треугольников, нарисованных на экране, не является сферным приближением. Как нарисовать сферу в приближении? Как указать порядок вершин (индексы в терминах OpenGL ES 2.0)?
2 ответа
Прежде чем начать что-либо в OpenGL ES, вот несколько советов:
Избегайте вздутие производительности процессора / графического процессора
Удаление интенсивных циклов вычислений путем перевода форм в автономный режим с помощью другой программы, безусловно, поможет Эти программы предоставят дополнительную информацию о фигурах / сетках помимо экспорта результирующей коллекции точек [x,y,z], составляющих фигуры и т. Д.
Я прошел через всю эту боль назад, потому что я продолжал искать алгоритмы рендеринга сфер и т. Д., А затем пытался оптимизировать их. Я просто хотел сэкономить ваше время в будущем. Просто используйте Blender, а затем ваш любимый язык программирования для разбора obj-файлов, экспортируемых из Blender, я использую Perl. Вот шаги для визуализации сферы: (используйте glDrawElements, потому что файл obj содержит массив индексов)
1) Download and install Blender.
2) From the menu, add sphere and then reduce the number of rings and segments.
3) Select the entire shape and triangulate it.
4) Export an obj file and parse it for the meshes.
Вы должны уметь понимать логику рендеринга сферы из этого файла: http://pastebin.com/4esQdVPP. Это для Android, но понятия одинаковы. Надеюсь это поможет.
Я боролся со сферами и другими геометрическими фигурами. Я работал над этим некоторое время и создал класс Objective-C для создания координат, нормалей и текстурных координат как с использованием индексированных, так и неиндексированных механизмов, класс здесь:
http://www.whynotsometime.com/Why_Not_Sometime/Code_Snippets.html
Что интересно увидеть в результате треугольники, представляющие геометрию, так это уменьшить разрешение (установить свойство разрешения перед генерацией координат). Кроме того, вы можете использовать GL_LINE_STRIP вместо GL_TRIANGLES, чтобы увидеть немного больше.
Я согласен с комментарием от wimp, что, поскольку вычисление координат обычно происходит один раз, используется не так много циклов ЦП. Кроме того, иногда хочется нарисовать только шар или мир или...