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
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.
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.
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
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?
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.
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/
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.