opengl es - tipos - Dibujar un borde en un polígono 2d con un sombreador de fragmentos
cuales son los tipos de bordes en excel (1)
Todo lo que necesitas son las coordenadas baricéntricas, ya que estás tratando con triángulos. Asigne una identidad a cada vértice del triángulo y luego use la interpolación incorporada del hardware entre las etapas de vértice y fragmento para calcular la distancia relativa de cada uno de los vértices en su sombreado de fragmentos.
Puedes pensar en las coordenadas baricéntricas para cada vértice como la distancia desde el borde opuesto. En el diagrama a continuación, el borde opuesto del vértice P0 es e1, y su distancia está representada por h1; su coordenada baricéntrica es <0.0, h1, 0.0>
. Las GPU pueden usar este espacio de coordenadas internamente para interpolar los atributos de vértice de los triángulos cuando se generan fragmentos durante la rasterización, lo que hace que las propiedades de vértice por peso se basen rápidamente en la ubicación dentro de un triángulo.
A continuación, se incluyen dos tutoriales que explican cómo hacer esto; por lo general, esto se usa para representar una superposición de wireframe, por lo que es posible que tenga más suerte al buscarlo. Para sus propósitos, dado que esto es efectivamente una especialización de renderizado de estructura alámbrica (con la adición de que desea eliminar líneas que no pertenecen a los bordes de polígonos exteriores), deberá identificar los vértices de los bordes y realizar un procesamiento adicional.
Por ejemplo, si un vértice no es parte de un borde exterior, querrá asignarle una coordenada baricéntrica de algo como <1,100,0> y el vértice conectado <0,100,1> y el borde interior se ignorará (suponiendo que es un borde opuesto al vértice designado <0,1,0>, como se ve en el siguiente diagrama). La idea es que nunca desea que un punto a lo largo de este borde interpole cerca de 0.0 (o cualquiera que sea su umbral que utilice para sombrear un fragmento como parte del borde), lo que lo hace extremadamente distante del centro del triángulo en la dirección de la El vértice opuesto resolverá esto.
Sin Geometry Shaders (OpenGL ES amigable):
Aquí hay un enlace que explica cómo hacer esto, si puede modificar sus datos de vértice para mantener las coordenadas baricéntricas. Tiene mayores requisitos de almacenamiento y preprocesamiento (en particular, puede que no sea posible compartir vértices entre bordes adyacentes, ya que necesita que cada triángulo consista en tres vértices que tengan una coordenada baricéntrica de entrada diferente, razón por la cual los sombreadores de geometría son una solución deseable). Sin embargo, se ejecutará en más hardware de clase OpenGL ES que en soluciones más generales que requieren sombreadores de geometría.
http://codeflow.org/entries/2012/aug/02/easy-wireframe-display-with-barycentric-coordinates/
Con Geometry Shaders ( No compatible con OpenGL ES):
Alternativamente, puede usar un sombreador de geometría para calcular las coordenadas baricéntricas de cada triángulo en el tiempo de procesamiento, como se ve en este tutorial. Lo más probable es que en OpenGL ES no tenga acceso a los sombreadores de geometría, por lo que probablemente esto puede ignorarse.
http://strattonbrazil.blogspot.com/2011/09/single-pass-wireframe-rendering_10.html http://strattonbrazil.blogspot.com/2011/09/single-pass-wireframe-rendering_11.html
La base teórica de esta solución se puede encontrar aquí (cortesía de Internet Archive Wayback Machine):
http://web.archive.org/web/ * / http://cgg-journal.com/2008-2/06/index.html
Tengo algunos polígonos simples (menos de 20 vértices) que se renderizan planos en un plano xy simple, usando GL_TRIANGLES y un color plano, una simulación 2D.
Me gustaría agregar un borde de grosor variable y un color diferente a estos polígonos. Tengo algo implementado usando los mismos vértices y glLineWidth / GL_LINE_LOOP, que funciona, pero es otro paso de representación y repite todas las transformaciones de vértice.
Creo que debería poder hacer esto en el sombreado de fragmentos usando gl_FragCoord y los datos de vértice y / o coordenadas de textura, pero no estoy seguro, y mis intentos ingenuos han sido obviamente incorrectos.
Me imagino algo como lo siguiente.
uniform vec2 scale; // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;
varying vec4 vertex; // in world coords
void main()
{
if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
{
// we''re close to the edge the polygon, so we''re the border.
gl_FragColor = border_color;
}
else
{
gl_FragColor = fill_color;
}
}
La parte que estoy tratando de averiguar es la función distance_from_edge - ¿cómo se puede calcular eso? ¿Es el uso de gl_FragCoord el enfoque equivocado? ¿Debo usar algún tipo de mapeo de textura?
Como experimento, intenté convertir el vértice en espacio de píxeles con la escala, y luego calculé la distancia entre eso y gl_FragCoord en píxeles, pero eso da resultados extraños que realmente no entendí. Además, necesito la distancia hasta el borde , no el vértice, pero no estoy seguro de cómo lograrlo.
¿Algunas ideas?
EDIT: basado en la respuesta de Nicol, mi pregunta se convierte en:
Suponiendo que tengo un triángulo con 3 vértices de esquina marcados como vértices de borde, y un vértice en el centro marcado como no borde (representado con 3 triángulos en total), entonces, ¿cómo se interpola en el sombreador de fragmentos para dibujar un borde de un ¿espesor? Supongo que paso el indicador de borde al sombreador de fragmentos, así como el grosor de línea deseado, y hace un cálculo de interpolación para calcular la distancia entre los vértices de borde y no de borde, y establece un umbral de color como borde / relleno según corresponda ?