2012-07-07 15 views
6

Tenemos una aplicación de dibujo para iOS. Actualmente, el dibujo se implementa con OpenGL ES 1.1. Usamos algunos algoritmos para suavizar las líneas, como las curvas de Bezier. Entonces, cuando ocurren eventos táctiles, obtenemos un conjunto de puntos fuera de los puntos de evento (basados ​​en algoritmos) y dibujamos estos puntos. También usamos textura de pincel para que los puntos tengan un aspecto más natural.Línea de textura suave con sombreadores OpenGL ES 2.0

Me pregunto si es posible implementar estos algoritmos en los sombreadores OpenGL ES 2.0. Algo así como llamar a una función OpenGL para dibujar líneas hechas de puntos táctiles y en la salida han suavizado la curva con textura cepillada representada.

enter image description here

Los puntos P0, P1, P4 ... aquí son eventos de toque y los puntos de curva roja - puntos de salida, con tal paso para T de manera que la distancia entre dos puntos vecinos en la curva no es mayor de 1 píxel

Y aquí está el enlace con Bezier explicación algoritmo: Bézier curve - Wikipedia, the free encyclopedia

Cualquier ayuda es muy apreciada. Gracias.

+0

¿Puede ser más específico? ¡No podemos decirle si es posible implementar un algoritmo en particular en un sombreado si no sabemos cuál es el algoritmo! – user1118321

+0

Realmente no importa qué algoritmo utilizamos. El punto aquí es que el sombreador debe producir más puntos en la salida que los puntos de entrada. He editado mi pregunta y he añadido un ejemplo con el algoritmo de Bezier. –

Respuesta

6

No puede generar nuevos vértices dentro del sombreado de vértices (puede hacerlo en el sombreador de geometría, que ES no tiene). El número de vértices de salida siempre es el mismo que el número de vértices de entrada, solo puede cambiar sus posiciones (y atributos de ohter, por supuesto).

Así que tendrías que dibujar una franja de línea hecha de vértices suficientes para garantizar una curva lo suficientemente suave. Lo que puede hacer es colocar siempre la misma franja de línea, teniendo los valores del parámetro de curva T como posiciones de vértices 1D. En el sombreado, utiliza esta posición de entrada (el valor del parámetro) para calcular la posición 2D/3D real en la curva usando el algoritmo DeCasteljau (o lo que sea) y los puntos P0 a P4 que pone en el sombreador como constantes (variables uniformes en términos GLSL).

Pero no estoy seguro de si eso realmente le compraría algo más de solo computar esos puntos en la CPU y ponerlos en una VBO dinámica. Lo que guarda es la copia de los puntos de la curva desde la CPU a la GPU y el cálculo en la CPU, pero, por otro lado, su sombreado de vértices es mucho más complejo. Es necesario evaluar cuál es el mejor enfoque. Si necesita calcular los puntos de la curva de cada cuadro (porque los puntos de control cambian cada cuadro) y la curva es bastante detallada, puede que no sea una mala idea. Pero de lo contrario, no creo que realmente pague. Y también su sombreador no se adaptará tan fácilmente a un número cambiante de puntos de control/grado de curva en tiempo de ejecución.

Pero una vez más, no puede poner en 5 puntos de control y generar N puntos de curva en la GPU. El sombreador de vértices siempre funciona en un solo vértice y da como resultado un único vértice, el mismo que el sombreador de fragmentos siempre funciona en un solo fragmento (digamos píxel, aunque todavía no es uno) y da como resultado un único fragmento (o ninguno) .

+0

¡Gracias por una respuesta muy completa! Estaba buscando una manera de hacer que el código sea más claro y también obtener algún rendimiento. Pero, como veo, este no es el caso. Por cierto, sugirió un enfoque muy interesante, pasando la línea 1D que representa a T. Pensaré en ello. –

+0

Claro :) Solo presioné enter para escribir desde la nueva línea y me envió el comentario :) ¡Gracias de nuevo! –

Cuestiones relacionadas