Farbige Kugel bleibt einfarbig freeglut c++

Gast #4723765
Lesenswert?

Hallo,
ich möchte mit opengl und c++ eine bunte Kugel darstellen. Die Kugel an 
sich wird mir auch schon dargestellt, allerdings bleibt diese weiss
1
  unsigned int red = 0;
2
  unsigned int green = 0;
3
  unsigned int blue = 0;
4

5
  for (float w1 = -1.0f; w1 < 1.0f; w1 += 0.002f)
6
  {
7
    red++;
8
    green++;
9
    blue++;
10
    glBegin(GL_LINE_LOOP);
11
    glColor3f(red, green, blue);
12
    for (float w2 = 0.0f; w2 < 3.145f * 2; w2 += 0.02f)
13
    {
14
      float X = w1;
15
      float Y = sin(w2) * sin(acos(w1));
16
      float Z = cos(w2) * sin(acos(w1));
17
      glVertex3f(X, Y, Z);
18
    }
19
    glEnd();
20
  }

der Code fängt ja mit der ersten for-schleife an, das ist ja im prinzip 
die x-Position. die zweite for-schleife werden die y- und die z- 
Koordinaten ermittelt und gezeichnet. für jeden 'ring' weiter rechts 
sollte sich die Farbe ja eigentlich ändern, aber die komplette kugel 
nimmt den letzten wert komplett an. D.h. wenn ich red++, green++, blue++ 
auskommentiere, bleibt die Kugel schwarz.

Worauf bezieht sich denn dann glColor3f?

Frank
Gast #4723794
Lesenswert?

Aber eine Nachfrage hätte ich direkt noch.
Wenn ich mehrere elemente (kugeln) in meinem Bild habe und möchte eine 
verschieben. Ist es möglich, dass ich nur diese eine Kugel lösche und 
neu zeichne, oder muss ich im prinzip das komplette bild leeren und alle 
kugeln neu erstellen?
Gast #4723829
Lesenswert?

Normalerweise zeichnet man immer das komplette Bild neu (außer 
vielleicht, wenn man was sicher wiederverwenden kann). Ein paar Kugeln 
sind aber auch keine Optimierung wert, das geht eher in Richtung 
umgefallener Sack Reis. Lohnenswert ist aber der Verzicht auf das 
überholte OpenGL, denn heutzutage kannst du ein paar Daten in die GPU 
schieben und musst nicht die CPU alle Strukturen immer neu generieren 
lassen.
#4724804
Lesenswert?

Jemand schrieb:
> Lohnenswert ist aber der Verzicht auf das
> überholte OpenGL, denn heutzutage kannst du ein paar Daten in die GPU
> schieben und musst nicht die CPU alle Strukturen immer neu generieren
> lassen.

Das ist Unsinn, denn dass kann modernes OpenGL auch. VBOs, VBAs, etc. 
alles da. Bei GLES hat man glBegin und glVertex sogar gleich entfernt. 
Aber für sowas lohnt sich Optimierung sowieso noch nicht, und die 
einzige alternative, mit der man bei grossen Projekten etwas 
beschleunigen kann, ist vulkan, und dass wäre hier sicher overkill.

Für Anfänger ist soetwas gerade Ideal, gerade weil man die 
Grundprinzipien lernen kann ohne sich um die Speicherverwaltung kümmern 
zu müssen.

Offtopic: Die effizienteste Methode in OpenGL eine Kugel zu zeichnen 
ist, indem man ein Quadrat nimmt, und den Verticies normalisierte 2D 
Positionen als Attribute mitgibt, so das die ecken Attribute mit XY 
Koordinaten 1 oder -1 haben. Im Fragment Shader kann man dann mit 
Pytagoras alles ab einer Distanz von 1 vom Mittelpunkt klippen, braucht 
nichteinmal ne Wurzel, und die Fragmenttiefe kann man auch gleich 
setzen. Diese Technik wurde z.B. bei Super Mario 64 verwendet:
https://jsfiddle.net/3h7gm5s7/1/
#4724942
Lesenswert?

Jemand schrieb:
> Lohnenswert ist aber der Verzicht auf das
> überholte OpenGL, denn heutzutage kannst du ein paar Daten in die GPU
> schieben und musst nicht die CPU alle Strukturen immer neu generieren
> lassen.

Na so überholt ist OpenGL nicht. Gerade kommen so die ersten Spiele, die 
alternativ auch den Nachfolger Vulkan nutzen können.

Daniel A. schrieb:
> Das ist Unsinn, denn dass kann modernes OpenGL auch. VBOs, VBAs, etc.
> alles da.

Und auch Vertex, Fragment, Geometry, Tesselation und Compute Shader - 
mit einer komplett eigenen Shader-Sprache.

> Bei GLES hat man glBegin und glVertex sogar gleich entfernt.

Beim "normalen" OpenGL ist es auch schon seit Jahren nur noch im 
Kompatibilitätsmodul und nicht mehr Pflicht für OpenGL-Treiber.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren