¿Cómo dibujar rápidamente una forma curva?
"rápidamente" supongo que uno debe usar las instalaciones de hardware tanto como sea posible
por "curva" me refiero a los límites definidos por curvas de Bezier cuadráticas o cúbicas
por "forma" me refiero a un trazo "grueso" (es decir, de más de 1 px de ancho) o un "polígono curvo 2D" con relleno par-impar / distinto de cero, posiblemente con agujeros (es decir, letra "O")
Estoy preguntando porque las opciones que conozco tienen varios inconvenientes:
triangular la forma y enviarla a OpenGL: realiza el trabajo más difícil en la CPU y puede usar demasiados / pocos triángulos (es decir, derrochador / grueso)
Atlas de texturas: tiene que volver a calcular / cargar la textura en cada cambio (forma, escala, rotación, ...)
Campo de distancia firmado: a gran escala, los detalles no se ven bonitos o tienen que volver a calcular / cargar la textura
NV_path_rendering: podría serlo si no funcionara solo en las tarjetas de Nvidia
OpenVG: podría serlo si no funcionara solo en dispositivos móviles
?
* Me parece que OpenVG no avanza exactamente, por decirlo suavemente. ¿Alguien sabe algo sobre sus perspectivas de futuro? ¿Vale la pena vigilar en la actualidad?
** OpenGL 4+ proporciona medios de teselación de polígonos sobre la marcha. ¿Podría usarse de alguna manera para refinar la malla desde la opción de "triangulación" para que el límite de la forma al menos no parezca "en ángulo"?
fuente
Respuestas:
Puede usar sombreadores de teselación OpenGl 4.x para convertir los puntos de control de Bezier en polígonos.
Una búsqueda en Google para "Tessellation Shader Bezier" encontró este esquema que describe la teselación de las superficies y curvas de Bezier:
http://web.engr.oregonstate.edu/~mjb/cs519/Handouts/tessellation.1pp.pdf
Esto descarga la evaluación Bezier de la CPU a la GPU y reduce el flujo de datos a través del bus.
fuente
Se puede hacer dibujo curvo con hardware. Hay un método descrito en GPU Gems 3 que describe cómo hacer esto. El usuario @yuriks realmente comenta esto. De hecho, he hecho una demostración rápida y sucia para que la veas.
Imagen 1 : Forma de curva acelerada HW (dibujada con un triángulo) y fuente webgl
fuente