[lnkForumImage]
Download FREE Software.

Confronta i prezzi di migliaia di prodotti.
News Forum Italiano
 Home | Login | Registrati | Ricerca 


 

Forums >

it.comp.giochi.sviluppo

[OpenGL] Problema con i vertici

Il Razziatore

04/10/2010 20:39:58

Salve a tutti
Io ho creato una finestra OpenGL ( con le SDL ) e ho attivato la
proiezione ortogolanele con il seguente codice ( non mi ricordo dove
l'ho trovato in effetti ):

// set a 2D orthographic projection
gluOrtho2D(0, WINDOW_WIDTH, 0, WINDOW_HEIGHT );
// invert the y axis, down is positive
glScalef(1, -1, 1);
// mover the origin from the bottom left corner
// to the upper left corner
glTranslatef(0, -WINDOW_HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);

Ovviamente intendo disegnare robba bidimenzionale. Disegno e tutto
funziona che è una meravigia fino a quando provo a fare una cosa molto
semplice: disegnale una linea dal punto (0,0) al punto (10,-10) e dal
punto (10,-10) al punto (20,-20) dovrei ottenere una linea continua dal
punto (0,0) al punto (20,-20) ma ottengo un buco.

da alcune prove noto che in realtà ha disegnato le due linee nello
segente modo:
( 0, 0 ) -> ( 9, -9 )
( 10, -10 ) -> ( 19, -9 )

mi ha disegnato la linea non includendomi l'estremo finale. Ho provato
sia con numeri reali che in virgola mobile. Ma niente stesso risultato.

Potrei semplicemente mettere un +1 ( o -1 ) nei parametri del glVertex
ma non uso la glVertex :D

sto sperimentando glDrawElements e dover duplicare tutti i vertici mi
rode parecchio. Che vantaggio ho ad usare glDrawElements se poi devo
radoppiare tutti vertici?

Comunque sembra che se io provi a disengare un quadrato di lato 20
centrato nell'origine ( e quindi con un vertice in (10,10) ) queste sono
le "correzioni" che bisogna apportare:

(0,-1) (+1,-1)
(0, 0) (+1, 0)

Qualcuno sa da cosa dipende e sa come porvi rimedio?

42 Risposte

(Matteo Perenzoni)

05/10/2010 08:29:26

0

On 4 Ott, 22:39, Il Razziatore <ilrazziat...@gmail.com> wrote:
> [cut]
> Qualcuno sa da cosa dipende e sa come porvi rimedio?

Strano, a me non e' mai successo...
Forse qundo li definisci con glVertexPointer sono degli interi? Io
solitamente uso float. Gli interi forse hanno una logica diversa di
"inclusione" degli estremi, come accade per il texturing.
--
Matteo
http://fuzzware.alte...
"A man with a new idea is a crank until the idea succeds" - M. Twain

Il Razziatore

05/10/2010 16:36:57

0

Il 05/10/2010 10.29, Matteo Perenzoni ha scritto:
> On 4 Ott, 22:39, Il Razziatore<ilrazziat...@gmail.com> wrote:
>> [cut]
>> Qualcuno sa da cosa dipende e sa come porvi rimedio?
>
> Strano, a me non e' mai successo...
> Forse qundo li definisci con glVertexPointer sono degli interi? Io
> solitamente uso float. Gli interi forse hanno una logica diversa di
> "inclusione" degli estremi, come accade per il texturing.

Ho iniziato con gli interi perché avevo pensato ( visto che disengo in
2D e che disegno "pixel per pixel" che mi servono i float? ) pero' dopo
aver scoperto il "bug" sono passato ai float anche perché pensavo a un
errore di conversione ( i punti sono calcolati tramite seni, coseni ecc
)... senza miglioramenti ovviamente.

per la precisione uso:

glVertexPointer( VERTEX_SIZE, GL_FLOAT, VERTEX_OFFSET, vertices );
glDrawElements( GL_POLYGON, 4, GL_UNSIGNED_BYTE, indices_2 );

per disegnare i poligoni e

glVertexPointer( VERTEX_SIZE, GL_FLOAT, VERTEX_OFFSET, vertices );
glDrawElements( GL_LINES, 4, GL_UNSIGNED_BYTE, indices_1 );

per disegnale le linee mentre per controllare l'esattezza dei punti uso
un normale:

glBegin(GL_POINTS );
glVertex2i( ... );
....
glEnd();

Sinceramente non me la spiego...

(Matteo Perenzoni)

05/10/2010 19:55:00

0

On 5 Ott, 18:36, Il Razziatore <ilrazziat...@gmail.com> wrote:

> glVertexPointer( VERTEX_SIZE, GL_FLOAT, VERTEX_OFFSET, vertices );
> glDrawElements( GL_POLYGON, 4, GL_UNSIGNED_BYTE, indices_2 );

Giusto per definire i contorni, cosa valgono le costanti di size e
offset?

> glBegin(GL_POINTS );
> glVertex2i( ... );
> ...
> glEnd();

E i punti messi con gl_points ti vanno nel posto giusto? E se usi
glVertex2f?

> Sinceramente non me la spiego...

Deve essere semplice, le cose inspiegabili lo sono sempre :)

--
Matteo
http://fuzzware.alte...
"A man with a new idea is a crank until the idea succeds" - M. Twain

Enrico Colombini

06/10/2010 06:48:52

0

On 05/10/2010 21.55, Matteo Perenzoni wrote:
> Deve essere semplice, le cose inspiegabili lo sono sempre :)

La dimensione impostata nella proiezione (ortogonale, immagino) coincide
*esattamente* col numero di pixel occupati?

--
.Erix.

Enrico Colombini

06/10/2010 08:24:45

0

On 06/10/2010 8.48, Enrico Colombini wrote:
> La dimensione impostata nella proiezione (ortogonale, immagino)

Ah, sorry, mi ero perso l'inizializzazione. Come non detto.
Che succede se invece di due LINES fai una LINE_STRIP?

--
.Erix.

Il Razziatore

06/10/2010 13:09:56

0

Il 05/10/2010 21.55, Matteo Perenzoni ha scritto:
> On 5 Ott, 18:36, Il Razziatore<ilrazziat...@gmail.com> wrote:
>
>> glVertexPointer( VERTEX_SIZE, GL_FLOAT, VERTEX_OFFSET, vertices );
>> glDrawElements( GL_POLYGON, 4, GL_UNSIGNED_BYTE, indices_2 );
>
> Giusto per definire i contorni, cosa valgono le costanti di size e
> offset?
>

Scusami era per non vedere i numeri nella chiamata ( che poi mi scordavo
anche cosa volevano dire :D ) ma hai ragione :D
#define VERTEX_SIZE 2
#define VERTEX_OFFSET 0

>> glBegin(GL_POINTS );
>> glVertex2i( ... );
>> ...
>> glEnd();
>
> E i punti messi con gl_points ti vanno nel posto giusto?

Sì.

> E se usi glVertex2f?

Non ho mai provato aspetta che faccio. Come sospettavo, stesso risultato.

Uhm ma se tu fai la stessa prova. Ad esempio disegni una linea tra

( -30.0 0.0 ) a ( +30.0, 0.0 )

Te la disegna giusta? A me la disegna da ( -30.0 0.0 ) a ( +29.0, 0.0 )....

>
>> Sinceramente non me la spiego...
>
> Deve essere semplice, le cose inspiegabili lo sono sempre :)

Speriamo!

> --
> Matteo
> http://fuzzware.alte...
> "A man with a new idea is a crank until the idea succeds" - M. Twain

Il Razziatore

06/10/2010 13:14:22

0

Il 06/10/2010 10.24, Enrico Colombini ha scritto:
> On 06/10/2010 8.48, Enrico Colombini wrote:
>> La dimensione impostata nella proiezione (ortogonale, immagino)
>
> Ah, sorry, mi ero perso l'inizializzazione. Come non detto.
> Che succede se invece di due LINES fai una LINE_STRIP?
>

Stesso errore di offset, solo che ( ovviamente ) se c'è un buco voluto
che so disegno una linea da (-15,0 )a (-5,0 ) e poi da (+5,0) a ( 15, 0)
lui mi tira una linea continua ( ma infondo è quello che deve fare )

Enrico Colombini

06/10/2010 14:31:32

0

On 06/10/2010 15.14, Il Razziatore wrote:
>> Che succede se invece di due LINES fai una LINE_STRIP?
>
> Stesso errore di offset, solo che ( ovviamente ) se c'è un buco voluto
> che so disegno una linea da (-15,0 )a (-5,0 ) e poi da (+5,0) a ( 15, 0)
> lui mi tira una linea continua ( ma infondo è quello che deve fare )

Se fai fare un angolo di 90 gradi tra le due linee (e/o le colori
diversamente), forse puoi capire su quale delle due sia il buco, anche
se non so bene cosa poi se ne possa dedurre :-)

Sempre in tema di esperimenti, che succede se attivi l'anti-aliasing per
le linee con glEnable(GL_LINE_SMOOTH) ?

(sono tutt'altro che esperto di OpenGL ma finora finora non ho notato
effetti del genere disegnando linee di precisione con DrawElements
sull'iPhone)

--
.Erix.

Gianpaolo Ingegneri

06/10/2010 16:10:28

0

> Ovviamente intendo disegnare robba bidimenzionale. Disegno e tutto
> funziona che è una meravigia fino a quando provo a fare una cosa molto
> semplice: disegnale una linea dal punto (0,0) al punto (10,-10) e dal
> punto (10,-10) al punto (20,-20) dovrei ottenere una linea continua dal
> punto (0,0) al punto (20,-20) ma ottengo un buco.

> da alcune prove noto che in realtà ha disegnato le due linee nello segente
> modo:
> ( 0, 0 ) -> ( 9, -9 )
> ( 10, -10 ) -> ( 19, -19 )
>
> mi ha disegnato la linea non includendomi l'estremo finale. Ho provato sia
> con numeri reali che in virgola mobile. Ma niente stesso risultato.

Difficile dirlo perchè dipende dall'algoritmo usato che nel discreto è
soggetto a imprecisione. Spesso se visualizzi una linea che ruota l'ultimo
pixel è ballerino, se non vado erraneo siamo sempre nel campo della
subpixel accuracy. Ti conviene fare delle prove fino a quando non capisci
il motivo. Da quello che ho capito non è coerente con i pixel di partenza
e di arrivo, altrimenti le due linee dovevano coincidere. Ti consiglio di
fare
alcune prove con glEnable(GL_LINE_SMOOTH) oppure glLineWidth(...)

Ti riporto quanto scritto nel reference manual delle OpenGL:

glLineWidth specifies the rasterized width of both aliased and antialiased
lines. Using a line width other than 1 has different effects, depending on
whether line antialiasing is enabled. To enable and disable line
antialiasing,
call glEnable and glDisable with argument GL_LINE_SMOOTH. Line
antialiasing is initially disabled.

--->If line antialiasing is disabled, the actual width is determined by
rounding the
supplied width to the nearest integer. (If the rounding results in the value
0,
it is as if the line width were 1.) If |Dx| >= |Dy|, n pixels are filled in
each column
that is rasterized, where n is the rounded value of width. Otherwise, n
pixels
are filled in each row that is rasterized.

If antialiasing is enabled, line rasterization produces a fragment for each
pixel
square that intersects the region lying within the rectangle having width
equal to
the current line width, length equal to the actual length of the line, and
centered
on the mathematical line segment. The coverage value for each fragment is
the window coordinate area of the intersection of the rectangular region
with the
corresponding pixel square. This value is saved and used in the final
rasterization
step.

Not all widths can be supported when line antialiasing is enabled. If an
unsupported width is requested, the nearest supported width is used.
Only width 1 is guaranteed to be supported; others depend on the
implementation. To query the range of supported widths and the size
difference between supported widths within the range, call glGet with
arguments GL_LINE_WIDTH_RANGE and GL_LINE_WIDTH_GRANULARITY.

Se risolvi il problema faccelo sapere ;-)


(Matteo Perenzoni)

09/10/2010 20:25:10

0

Avevo fatto un rispostone, ma qualcosa non ha funzionato nonostante il
messaggio "post riuscito"... quindi riassumo all'estremo!

Erase and rewind!

> [snip]
> dal punto (0,0) al punto (10,-10) e dal
> punto (10,-10) al punto (20,-20) dovrei ottenere una linea continua dal
> punto (0,0) al punto (20,-20) ma ottengo un buco.
>
> da alcune prove noto che in realtà ha disegnato le due linee nello
> segente modo:
> (  0,  0 ) -> ( 9, -9 )
> ( 10, -10 ) -> ( 19, -9 )

(19,-19) per l'ultimo punto, immagino.
Sinceramente, da come descrivi il buco non lo vedo: il punto (9,-9) è
diagonalmente adiacente a (10,-10), come tutti i punti di una linea a
45 gradi, no?
--
Matteo
http://fuzzware.alte...
"A man with a new idea is a crank until the idea succeds" - M. Twain