2013-03-20 12 views
5

sulla base delle seguenti risorse, ho cercato di ottenere la risoluzione indipendente di Bézier cubica di rendering sulla GPU di lavorare:Risoluzione di Bézier cubica indipendente attingendo GPU (Blinn/Loop)

GPU Gems 3 Chapter 25

Curvy Blues

Resolution Independent Curve Rendering using Programmable Graphics Hardware

Ma come indicato nel sito Web di Curvy Blues, ci sono errori nei documenti sugli altri due siti web. Curvy Blues mi dice di guardare i commenti, ma non riesco a trovare quei commenti. Un altro forum da qualche parte mi dice lo stesso, non ricordo cosa fosse quel forum. Ma c'è sicuramente qualcosa che mi manca.

In ogni caso, ho cercato di rigenerare ciò che sta accadendo e non riesco a capire la parte in cui il discriminante viene calcolato dai determinanti di una combinazione di coordinate trasformate.

Quindi ho le coordinate originali, le inserisco in una matrice 4x4, trasformo questa matrice con la matrice M3 e ottieni la matrice C. Quindi creo le matrici 3x3 dalle coordinate nella matrice C e calcoliamo i determinanti, che possono quindi essere combinati per creare a, b e c dell'equazione quadratica che mi aiuterà a trovare le radici.

Il problema è, quando lo faccio esattamente così: la discriminante non è corretta. Metto chiaramente le coordinate per una serpentina (una simmetrica, ma una serpentina corretta), ma afferma che è una cuspide. Quando lo calcolo io stesso usando wxMaxima, derivando al 1 ° e 2 ° ordine e quindi calcolando il prodotto incrociato, semplificando ad un'equazione quadratica, il discriminante di tale equazione sembra essere corretto quando inserisco le stesse coordinate. Quando impongo al codice di usare la mia discriminante per determinare se si tratta di una serpentina o meno, ma io uso i determinanti per calcolare le ulteriori coordinate della trama k, l, m, anche il risultato è errato. Quindi presumo ci debba essere un errore nelle determinanti.

Qualcuno può aiutarmi a capire bene?

risposta

2

Penso di essere riuscito a risolverlo. I risultati sono quasi perfetti (a volte invertiti, ma probabilmente è un problema diverso).

È qui che ho sbagliato, e spero di poter aiutare altre persone a non sprecare tutto il tempo che ho sprecato a cercare questo.

Ho basato il mio codice sul documento blinn-phong. Ho avuto le coordinate b0, b1, b2, b3. Ho usato visualizzarli come coordinate 2D con un w, ma ho cambiato questa vista, e questo ha risolto il problema. Visualizzandoli come coordinate 3D con z = 0 e rendendoli omogenei con le coordinate 4D per la trasformazione (w = 1), la soluzione è arrivata.

Calcolando la matrice C: C = M3 * B, ho ottenuto queste nuove coordinate. Durante il calcolo dei determinanti d0, d1, d2, d3, ero solito prendere le coordinate x, y dalle colonne 0 e 1 nella matrice C e il fattore w dalla colonna 2. SBAGLIATO! Quando ci pensi, le coordinate sono in realtà coordinate 3D, quindi, per i fattori W, dovresti prendere la colonna 3 e ignorare la colonna 2.

Questo mi ha dato determinanti corretti, risultando in una discriminante che era in grado di ordinare fuori che tipo di curva stavo gestendo.

Ma attenzione, ciò che ha reso la mia ricerca ancora più lunga è stato il fatto che ho assunto che quando è visibilmente una serpentina, il risultato della discriminante dovrebbe essere sempre> 0 (serpentino). Ma questo non è sempre il caso, quando si ha un sepentino matematicamente perfetto (le coordinate sono così che la media è esattamente al centro), il determinante dirà che è un'aumentata (determinante = 0). Ero solito pensare che questo risultato fosse sbagliato, ma non lo è. Quindi non farti ingannare da questo.

+0

fantastico, ho letto la tua risposta, mi ha aiutato molto. Sai come risolvere l'artefatto sul caso Loop? Ho una domanda qui: http://stackoverflow.com/questions/20970673/how-to-solve-rendering-artifact-in-blinn-loops-resolution-independent-curve-ren – azer89

+0

No, purtroppo ho avuto qualche problemi irrisolti e ho smesso di provare a risolverlo ... Ma ora vedo che l'hai appena risolto in quel thread, forse la tua soluzione aiuta con i miei problemi ... ci penserò io! – scippie

+0

Ho ancora un problema in più, le curve renderizzate possono essere sia convesse che concave, mi sto ancora chiedendo se ci sia un test per determinare questo. – azer89

1

Il libro GPU Gem 3 ha un errore qui, e the page on nVidia's website ha l'errore troppo:

a3 = b2 * (b1 x b1) 

in realtà è a3 = b2 * (b1 x b0).

Ci sono altri problemi relativi a questo algoritmo: la parte exp del punto mobile avrà un overflow durante il calcolo, quindi dovresti essere cauto e aggiungere operazioni di normalizzazione nel codice.

+0

Non ho mai trovato una soluzione perfettamente funzionante, quindi quello che stai dicendo potrebbe essere.Forse lo scaverò di nuovo un giorno, perché i beziers cubici indipendenti dalla risoluzione sono fantastici ... – scippie

Problemi correlati