2012-11-19 27 views
7

Sto provando a disegnare un rettangolo con 4 linee (a sinistra). Ma a prescindere da come disegno (striscia, cappio, linee semplici) il risultato è quello a destra: mancano i pixel agli angoli.OpenGL disegna contorno rettangolo

|||||||||||  |||||||||| 
|   | |   | 
|   | |   | 
|||||||||||  |||||||||| 

C'è un modo per ottenere il risultato sul lato sinistro?

EDIT

Non può inviare il codice poiché dipende molto dal quadro di fondo, ma tutti disegnare le chiamate non sono altro che glDrawElements con tampone di indice che punta a 4 vertici, senza prove alfa.

Dopo giocherellare con le coordinate come suggerito arrivati ​​a questo risultato interessante (simulatore iOS):

sample

Avviso solo nell'angolo in alto a sinistra manca pixel per alcuni rettangoli ... Tutti i rettangoli sono disegnati in GL_LINES modalità all'interno di un singolo elemento di richiamo chiamata. Non vengono disegnate altre cose

EDIT 2

OpenGL FAQ domanda 14.100 membri che

OpenGL non fornisce un meccanismo per unire in modo pulito linee che condividono i vertici comuni né per coronare in modo pulito gli endpoint.

+6

Come su di noi si mostra il tuo codice? – datenwolf

+1

Inoltre, stai usando il desktop OpenGL o OpenGL ES? –

+0

Sto usando OpenGL ES sul simulatore iOS – Kimi

risposta

12

Spostare il coordinate cornice un po 'in modo che le linee cadono su centri di pixel:

rect

#include <GL/glut.h> 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    glOrtho(0, w, 0, h, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // important 
    glTranslatef(0.5, 0.5, 0); 

    float offset = 40; 
    glColor3ub(255, 0, 0); 
    glBegin(GL_LINE_LOOP); 
    glVertex2f(0+offset, 0+offset); 
    glVertex2f(0+offset, h-offset); 
    glVertex2f(w-offset, h-offset); 
    glVertex2f(w-offset, 0+offset); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(320,240); 
    glutCreateWindow("Rect"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
Problemi correlati