2012-02-16 3 views
9

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

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

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

Похожий вопрос Similar Stackoverflow question, but no suggestion to solution

+0

Вы нашли ответ для этого? –

ответ

7

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

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

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

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

+0

Это относится и к OpenGL (не ES)? – Rick

+0

OpenGL имеет устаревший фиксированный конвейер, но его не рекомендуется использовать. См. Эту статью для получения дополнительной информации: https://www.opengl.org/wiki/Fixed_Function_Pipeline – Benlitz

+0

Спасибо. Я пытаюсь использовать SceneKit в OS X 10.10 (или 10.11), чтобы передать массив разделяемых вершин, массив индексов для треугольников и сделать его плоским. Под ним используются OpenGL или Metal, но я тоже мало знаю об этом. Этот автор (http://ronnqvi.st/custom-scenekit-geometry/), казалось, думал, что это не то, что может сделать OpenGL, поэтому я искал, можно ли это сделать, и вот как я нашел этот вопрос SO , – Rick

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

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