Могу ли я указать нормали для каждого лица в OpenGL ES и добиться негладкого / плоского затенения? - PullRequest
9 голосов
/ 16 февраля 2012

Я хочу отображать модели сетки в OpenGL ES 2.0, где он четко отображает фактическую сетку, поэтому я не хочу плавного затенения для каждого примитива / треугольника. Единственные два варианта, о которых я могу думать, это

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

Это должно быть так? Почему я не могу просто читать в примитивах и не указывать никаких нормалей и каким-то образом позволить OpenGL ES 2.0 сделать плоский оттенок на каждом лице?

Аналогичный вопрос Аналогичный вопрос Stackoverflow, но нет предложения по решению

1 Ответ

7 голосов
/ 04 июня 2012

Потому что для того, чтобы на вашей сетке было затенение (любое, гладкое или плоское), вам нужна модель освещения, и OpenGL ES не может ее угадать. В GL ES 2 нет фиксированного конвейера, поэтому вы не можете использовать любую встроенную функцию, которая будет выполнять эту работу за вас (используя встроенную модель освещения).

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

Затем графический процессор работает очень параллельно, обрабатывая несколько вершин (а затем и фрагменты) одновременно. Чтобы быть эффективным, он не может делиться данными между вершинами. Вот почему вам нужно копировать нормали для каждой вершины.

Кроме того, ваша сетка больше не может делить вершины между треугольниками, как вы сказали, потому что они разделяют только положение вершины, а не нормаль вершины. Поэтому вам нужно поместить в буфер 3 * NbTriangles вершин, каждая из которых имеет одну позицию и одну нормаль. Вы также не можете получить выгоду от использования треугольных полос / вееров, потому что ни одно из ваших лиц не будет иметь общую вершину с другой (потому что, опять же, другие нормали).

...