2012-11-19 19 views
7

Ich versuche, ein Rechteck mit 4 Linien (links) zu zeichnen. Aber egal, wie ich zeichne (Streifen, Loop, glatte Linien), das Ergebnis ist das rechte - es fehlen Pixel an den Ecken.OpenGL zeichnen Rechteck Umriss

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

Gibt es einen Weg, um die linke Seite Ergebnis zu bekommen?

EDIT

kann nicht Code schreiben, da es eine Menge auf dem darunter liegenden Rahmen hängt, aber alle ziehen Anrufe sind nichts anderes als glDrawElements mit Indexpuffer zeigt auf 4 Ecken, keine Alpha-Tests.

Nachdem mit den Koordinaten Hantieren wie bei diesem interessanten Ergebnis (iOS Simulator) angekommen schlugen vor:

sample

Hinweis nur obere linke Ecke Pixel für einige Rechtecke fehlt ... Alle Rechtecke werden in GL_LINES gezeichnet Modus innerhalb einzelner Zeichnungselemente aufrufen. Keine anderen Dinge sind gezeichnet.

EDIT 2

OpenGL FAQ Frage 14.100 besagt, dass

OpenGL keinen Mechanismus zur Verfügung stellen, um sauber Linien zu verbinden, die gemeinsame Ecken teilen noch deckeln sauber die Endpunkte.

+6

Wie über Sie uns zeigen Sie Ihren Code? – datenwolf

+1

Verwenden Sie Desktop-OpenGL oder OpenGL ES? –

+0

Ich verwende OpenGL ES auf iOS-Simulator – Kimi

Antwort

12

Verlagern Sie Ihr Rahmen ein bisschen koordinieren, um Ihre Linien auf Pixelzentren fallen:

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; 
} 
Verwandte Themen