2017-07-14 3 views
0

Ich entwickle eine App, die Auswahl Auswahl mit Farbtiefe in OpenGL für Mac verwenden. Die Auswahl funktioniert großartig, aber ich habe beobachtet, dass OpenGL keine perfekten Kreise zeichnet (circunferences). Ich benutze GL_LINE_LOOP, um 360 Segmente zu rendern, um eine enge Verbindung herzustellen. Aber wenn ich das Rendering im SELECTION-Modus sehe, beobachte ich eine Art Bisse (Dreiecke in Weiß) über die Circunference, insgesamt 4 für jeden Kreis.OpenGL für OSX nicht perfekte Umfänge

Ist ein OpenGL-Problem oder mache ich etwas falsch?

Dies ist der Code zum Zeichnen jeder circunference. .

glLineWidth(10.0f); // Exaggerated for image. 
glBegin(GL_LINE_LOOP); 
    for (int i = 0; i <= 360; i++) { 

     calcX = radio * cos((i * M_PI)/180) + offset_x; 
     calcY = radio * sin((i * M_PI)/180) + offset_y; 
     glVertex3f(calcX, calcY, offset_z); 
    } 
glEnd(); 

Tree circunferences with bits

+0

Es sieht fast so aus, als ob das Ende der Linie auf diese Weise angewinkelt ist ... –

+1

Grafikhardware kann (und tut) in der Art und Weise variieren, wie Linien, besonders breite, gerendert werden. Abhängig von Ihrer Hardware können breite Linien gezeichnet werden, indem mehrere ein Pixel breite Linien durch Verschieben der Linienkoordinaten wiedergegeben werden. Der beste Ansatz für das, was Sie zeigen, ist wahrscheinlich, einen dreieckigen Streifen in der Form der Ellipse zu erzeugen, dessen Breite der gewünschten Linienbreite entspricht. Es ist auch wahrscheinlich, dass es schneller rendert als breite Linien (moderne Hardware bevorzugt das Rendern von Dreiecken). – radical7

Antwort

0

Dank „radical7, für die das vorschlagen Triangles zu verwenden, anstatt Linien ich in der Lage war, einen perfekten Ring zu erhalten, arbeitet als glatte

Dies ist der Code.

 color = 0.00277778; 
     glBegin(GL_TRIANGLE_STRIP); 

     for (int i = 0; i <= 360; i++) { 

      glColor4f(color, 0, 0, 1.0f); 
      calcX = radio * cos((i * M_PI)/180) + offset_x; 
      calcY = radio * sin((i * M_PI)/180) + offset_y; 
      glVertex3f(calcX, calcY, offset_z); 
      radio +=20; 

      calcX = radio * cos((i * M_PI)/180) + offset_x; 
      calcY = radio * sin((i * M_PI)/180) + offset_y; 
      glVertex3f(calcX, calcY, offset_z); 
      radio -=20; 

      color += 0.00277778; 
     } 
     glEnd(); 

Ergebnis:

Perfect ring...