Сколько вершин нужно, чтобы нарисовать куб в OpenGL ES? - PullRequest
9 голосов
/ 17 февраля 2011

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

float vertices[] = { -width, -height, -depth, // 0
                              width, -height, -depth, // 1
                              width,  height, -depth, // 2
                             -width,  height, -depth, // 3
                             -width, -height,  depth, // 4
                              width, -height,  depth, // 5
                              width,  height,  depth, // 6
                             -width,  height,  depth // 7
        };  
  short indices[] = { 0, 2, 1,
                0, 3, 2,

                1,2,6,
                6,5,1,

                4,5,6,
                6,7,4,

                2,3,6,
                6,3,7,

                0,7,3,
                0,4,7,

                0,1,5,
                0,5,4
                         };

А вот еще один:

float vertices[] = {
            //Vertices according to faces
                -1.0f, -1.0f, 1.0f, //Vertex 0
                1.0f, -1.0f, 1.0f,  //v1
                -1.0f, 1.0f, 1.0f,  //v2
                1.0f, 1.0f, 1.0f,   //v3

                1.0f, -1.0f, 1.0f,  //...
                1.0f, -1.0f, -1.0f,         
                1.0f, 1.0f, 1.0f,
                1.0f, 1.0f, -1.0f,

                1.0f, -1.0f, -1.0f,
                -1.0f, -1.0f, -1.0f,            
                1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f, -1.0f,

                -1.0f, -1.0f, -1.0f,
                -1.0f, -1.0f, 1.0f,         
                -1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f, 1.0f,

                -1.0f, -1.0f, -1.0f,
                1.0f, -1.0f, -1.0f,         
                -1.0f, -1.0f, 1.0f,
                1.0f, -1.0f, 1.0f,

                -1.0f, 1.0f, 1.0f,
                1.0f, 1.0f, 1.0f,           
                -1.0f, 1.0f, -1.0f,
                1.0f, 1.0f, -1.0f,
                                    };

Какое представление является самой высокой производительностью в OpenGL ES (обратите внимание, что это OpenGL ES, а не OpenGL)? Что является лучшим представлением, когда я хочу указать нормали для освещения. В одной из моих других цитат о SO у меня сложилось впечатление, что мне нужно указать 24 вершины для куба, другая говорит, что мне нужно 36 вершин, а другая говорит, что мне нужно другое число, чтобы получить противоречивые ответы на тот же вопрос. В любом случае, я хочу знать правильный единственный ответ, который технически правильный.

Я знаю, что для рисования существует концепция вентиляторов с треугольной полосой, треугольника и т. Д., Но в моем случае я использую:

gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices,
                GL10.GL_UNSIGNED_SHORT, mIndicesBuffer);

Так что это должно ясно прояснить то, что я спрашиваю.

1 Ответ

20 голосов
/ 17 февраля 2011

Если вы используете индексы, вам нужно всего лишь указать 8 различных вершин для определения куба в OpenGL ES.Например:

static const GLfloat cubeVertices[] = {
    -1.0, -1.0,  1.0,
    1.0, -1.0,  1.0,
    -1.0,  1.0,  1.0,
    1.0,  1.0,  1.0,
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    1.0,  1.0, -1.0,
};

static const GLushort cubeIndices[] = {
    0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1
};

Используя здесь треугольную полосу для геометрии, мне нужно было указать только 14 индексов для указания куба.Вы можете удалить вышеприведенные индексы и предоставить вершины в указанном порядке, если хотите.

В genpfault описан случай, когда вы предоставляете чистые треугольники для OpenGL ES, и в этом случае вам потребуется 36 вершин.Как вы можете видеть, многие из этих вершин являются избыточными, поэтому полосы или индексы могут уменьшить геометрию, которую вам нужно отправить.

Эрик подытожил хороший момент в своем комментарии, что если вам нужно предоставить текстуру илицвет каждого лица (который кажется вашей целью ), вам нужно использовать 24 вершины или индексы.Это необходимо для того, чтобы вы могли обращаться к каждому лицу отдельно.

Какая максимальная производительность для вашего конкретного приложения будет зависеть от оборудования, на котором вы работаете.Например, на чипах PowerVR внутри устройств iOS Apple имеет следующее выражение: :

Для лучшей производительности ваши модели должны быть представлены в виде одной неиндексированной треугольной полосы с использованием glDrawArrays скак можно меньше дублированных вершин.Если вашим моделям требуется дублирование множества вершин (поскольку многие вершины совместно используются треугольниками, которые не появляются последовательно в полосе треугольника, или потому что ваше приложение объединяет много меньших полос треугольника), вы можете добиться лучшей производительности, используя отдельный буфер индекса и вызывая glDrawElementsвместо.Здесь есть компромисс: неиндексированная полоса треугольника должна периодически дублировать целые вершины, в то время как список проиндексированных треугольников требует дополнительной памяти для индексов и добавляет накладные расходы для поиска вершин.Для достижения наилучших результатов протестируйте свои модели, используя как индексированные, так и неиндексированные треугольные полоски, и используйте ту, которая работает быстрее всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...