2012-02-16 9 views
9

Quiero mostrar modelos de malla en OpenGL ES 2.0, donde muestra claramente la malla real, por lo que no quiero sombreado uniforme en cada primitiva/triángulo. Las únicas dos opciones que puedo pensar son¿Puedo especificar por cara normal en OpenGL ES y lograr sombreado no liso/plano?

  1. Cada triángulo tiene su propio conjunto de normales, todas perpendiculares a la superficie de triángulos (pero entonces supongo que no puedo compartir entre los vértices de triángulos con esta opción)
  2. Indicar triángulo bordes/primitivos utilizando líneas negras y se adhieren a la forma normal con vértices compartidos y uno normal para cada vértice

¿tiene que ser así? ¿Por qué no puedo simplemente leer en primitivos y no especificar ninguna norma y de alguna manera dejar que OpenGL ES 2.0 haga sombra en cada cara?

pregunta similares Similar Stackoverflow question, but no suggestion to solution

+0

¿Encontró la respuesta para esto? –

Respuesta

7

Debido a que el fin de tener el sombreado en su malla (cualquiera, lisa o plana), se necesita un modelo de iluminación, y OpenGL ES no puede adivinar. No hay una tubería fija en GL ES 2 por lo que no puede usar ninguna función incorporada que haga el trabajo por usted (usando un modelo de iluminación incorporado).

En sombreado plano, todo el triángulo se dibujará con el mismo color, calculado desde el ángulo entre su fuente normal y la fuente de luz (Sí, también necesita una fuente de luz, que podría ser simplemente el origen de la vista en perspectiva) Es por eso que necesita al menos un normal por triángulo.

Luego, una GPU funciona de forma muy paralela, procesando varios vértices (y luego fragmentos) al mismo tiempo. Para ser eficiente, no puede compartir datos entre vértices. Es por eso que necesita replicar las normales para cada vértice.

Además, su malla ya no puede compartir vértices entre triángulos como usted dijo, porque comparten solo la posición del vértice, no el vértice normal. Entonces necesitas poner vértices 3 * NbTriangles en tu buffer, cada uno teniendo una posición y uno normal. Tampoco puede tener el beneficio de usar bandas/ventiladores de triángulo, porque ninguna de sus caras tendrá un vértice común con otro (porque, de nuevo, normales diferentes).

+0

¿Esto también es cierto para OpenGL (no ES)? – Rick

+0

OpenGL tiene una tubería fija heredada, pero no se recomienda su uso. Consulte este artículo para obtener más información: https://www.opengl.org/wiki/Fixed_Function_Pipeline – Benlitz

+0

Gracias. Lo que estoy tratando de hacer es usar SceneKit en OS X 10.10 (o 10.11) para pasar una matriz de vértices compartidos, una matriz de índices para los triángulos, y tener una sombra plana. Debajo usa OpenGL o Metal, pero no sé lo suficiente sobre ninguno de ellos. Este autor (http://ronnqvi.st/custom-scenekit-geometry/) pareció pensar que no era algo que OpenGL pudiera hacer, así que he estado buscando para ver si puede, y así es como encontré esta pregunta ASÍ . – Rick

Cuestiones relacionadas