Forum: PC-Programmierung Farbige Kugel bleibt einfarbig freeglut c++


von Frank (Gast)


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

von Jim M. (turboj)


Lesenswert?

Nimm mal einen der Farbwerte Inkrements raus:
1
   red++;
2
// green++;
3
   blue++;

Außerdem fehlt da eine Skalierung: 0.0f ist Schwarz, 1.0f ist schon weiß 
(=maximale Helligkeit). Werte über 1 sind weiss.

Farbwerte sind float und nicht int.

: Bearbeitet durch User
von Frank (Gast)


Lesenswert?

Jim M. schrieb:
> Nimm mal einen der Farbwerte Inkrements raus:

der letzte Farbwert bleibt trotzdem für die ganze Kugel. Ist im obigen 
fall halt nicht mehr weiss, sondern pink.

Frank schrieb:
> D.h. wenn ich red++, green++, blue++
> auskommentiere, bleibt die Kugel schwarz.

Das hatte ich damit eigentlich gemeint.

von Frank (Gast)


Lesenswert?

Jim M. schrieb:
> Farbwerte sind float und nicht int.

das war es, hatte diese als int deklariert. daher war die kugel auch 
sofort einfarbig, wenn ich z.b red+=0.001; gemacht habe.

Danke dir, jetzt kann ich erst mal weiter machen

von Frank (Gast)


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?

von Jemand (Gast)


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.

von Daniel A. (daniel-a)


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/

von Rolf M. (rmagnus)


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.

von Jemand (Gast)


Lesenswert?

Ich habe mich falsch ausgedrückt. Ich meinte nicht OpenGL wäre veraltet, 
sondern bezog mich auf den inzwischen veralteten Teil von OpenGL :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.