mikrocontroller.net

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


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  unsigned int red = 0;
  unsigned int green = 0;
  unsigned int blue = 0;

  for (float w1 = -1.0f; w1 < 1.0f; w1 += 0.002f)
  {
    red++;
    green++;
    blue++;
    glBegin(GL_LINE_LOOP);
    glColor3f(red, green, blue);
    for (float w2 = 0.0f; w2 < 3.145f * 2; w2 += 0.02f)
    {
      float X = w1;
      float Y = sin(w2) * sin(acos(w1));
      float Z = cos(w2) * sin(acos(w1));
      glVertex3f(X, Y, Z);
    }
    glEnd();
  }

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

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm mal einen der Farbwerte Inkrements raus:
   red++;
// green++;
   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
Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel A. (daniel-a)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jemand (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.