2012-07-07 12 views
6

Abbiamo un'app di disegno iOS. Attualmente, il disegno è implementato con OpenGL ES 1.1. Usiamo alcuni algoritmi per smussare le linee come le curve di Bezier. Quindi, quando si verificano eventi tattili, otteniamo alcuni punti dai punti di evento tattile (basati su algoritmi) e tracciamo questi punti. Usiamo anche la texture del pennello per far sì che i punti abbiano un aspetto più naturale.Linea testurizzata uniforme con ombreggiatori OpenGL ES 2.0

Mi chiedo se sia possibile implementare questi algoritmi negli shader OpenGL ES 2.0. Qualcosa come chiamare una funzione OpenGL per disegnare linee fatte di punti tattili e in uscita hanno reso uniformi le curve rese con pennellate.

enter image description here

Punto P0, P1, ... P4 qui sono eventi di tocco e punti sulla curva rossa - punti di uscita, con tale passo per T in modo che la distanza tra due punti vicini sulla curva non è maggiore di 1 pixel.

E qui è il legame con Bezier algoritmo spiegazione: Bézier curve - Wikipedia, the free encyclopedia

Ogni aiuto è molto apprezzato. Grazie.

+0

Puoi essere più specifico? Non possiamo dirti se è possibile implementare un particolare algoritmo in uno shader se non sappiamo quale sia l'algoritmo! – user1118321

+0

Non importa quale algoritmo utilizziamo. Il punto qui è che lo shader dovrebbe produrre più punti in uscita rispetto ai punti di input. Ho modificato la mia domanda e aggiunto un esempio con l'algoritmo di Bezier. –

risposta

6

Non è possibile generare nuovi vertici all'interno del vertex shader (è possibile farlo nello shader della geometria, che ES non ha). Il numero di vertici di output è sempre lo stesso del numero di vertici di input, è possibile solo modificare le loro posizioni (e ovviamente gli attributi di altro tipo).

Quindi dovresti disegnare una linea composta da vertici sufficienti per garantire una curva abbastanza regolare. Quello che puoi fare è inserire sempre la stessa striscia di linea, con i valori dei parametri della curva T come posizioni dei vertici 1D. Nello shader, quindi, si utilizza questa posizione di input (il valore del parametro) per calcolare la posizione 2D/3D effettiva sulla curva usando l'algoritmo DeCasteljau (o qualsiasi altra cosa) ei punti da P0 a P4 che si mettono nello shader come costanti (variabili uniformi in termini GLSL).

Ma non sono sicuro se questo ti comprerebbe davvero qualcosa semplicemente calcolando quei punti sulla CPU e inserendoli in un VBO dinamico. Ciò che si salva è la copia dei punti della curva da CPU a GPU e il calcolo sulla CPU, ma d'altra parte il vertex shader è molto più complesso. Deve essere valutato quale sia l'approccio migliore. Se hai bisogno di calcolare i punti della curva ogni fotogramma (perché i punti di controllo cambiano ogni fotogramma) e la curva è piuttosto dettagliata, potrebbe non essere un'idea così brutta. Ma per il resto non penso che paghi davvero. Inoltre, lo shader non sarà facilmente adattabile a un numero variabile di punti di controllo/grado di curva in fase di runtime.

Ma ancora una volta, non è possibile inserire 5 punti di controllo e generare N punti di curva sulla GPU. Il vertex shader funziona sempre su un singolo vertice e produce un singolo vertice, lo stesso del framment shader funziona sempre su un singolo frammento (diciamo pixel, anche se non lo è ancora uno) e genera un singolo (o nessun) frammento .

+0

Grazie per la risposta molto completa! Stavo cercando un modo per rendere il codice più chiaro e ottenere anche delle prestazioni. Ma, come vedo, questo non è il caso. A proposito, hai suggerito un approccio molto interessante, passando una linea 1D che rappresenta T. Ci penserò attorno. –

+0

Certo :) Ho appena premuto invio per scrivere dalla nuova riga e ha inviato il commento :) Grazie ancora! –