OpenGL: Von R^2 nach R^3 abbilden. Z.B. Kugel erstellen



  • Guten Morgen!
    Ich bin relativ neu in OpenGL und wollte mir erstmal einen kleinen Funktionsbetrachter für mathematische Funktionen bauen. Und das mit dem alten OpenGl, da es schon beim Compiler mit dabei ist und ich nicht mehr brauche (stimmts?).
    Es sollen Funktionen von R^2 (2D) in den R^3 (3D) abgebildet werden, also sowas wie "vektor-r(u, v)",
    bzw. "( x(u,v), y(u,v), z(u,v) )".

    Ich frage mich nur, wie man das optimal in OpenGl umsetzt..
    Soviel habe ich schon herausgefunden (ungetestet):
    - Jedes GL_QUAD einzend zeichnen. (Viele Punkte doppelt..)
    - Zeilenweise zeichnen mit einem GL_QUAD_STRIP und seehr schmalen Quads für die Zeilensprünge. (Macht mal das so?)
    - Zeilenweise zeichnen mit mehreren GL_QUAD_STRIP-s. (Weniger Punkte doppelt.. Das scheint mir am saubersten, ich weiß aber nicht wie schnell mehrere glBegin()/glEnd() sind...)

    ...Aber eigentlich suche ich jetzt eine Erweiterung vom GL_QUAD_STRIP für Flächen. Also sozusagen:
    0D = GL_QUAD -> 1D = GL_QUAD_STRIP -> 2D = "GL_QUAD_PLANE"
    Nur habe ich sowas wie "GL_QUAD_PLANE" noch nicht gefunden.

    Dafür aber irgendwelche glMaps, Indices, glVertexArrays, Meshes und Grids... Ist alles etwas verschwommen, weil mir das nicht viel gesagt hat (und ich nicht weiß obs nun für das neue, oder alte OpenGl gilt).
    Ich wüsste gerne, was es mit diesen Begriffen auf sich hat, bzw. wann ich was brauche!?

    Wenn ich das richtig sehe, ist das allgemeinste ein Polygon zu zeichnen. Und je nach dem, ob man etwas vereinfachen kann, z.B. Eckpunkte mehrfach zu benutzen, gibt es entsprechende Vereinfachungen in OpenGl, wie z.B. GL_QUAD_STRIP..
    Dazu muss es doch irgendwo eine Übersicht geben, oder nicht?

    Kann mir dabei vielleicht jemand hier weiterhelfen, und/oder mir eine nette, am besten bebilderte (warum habe ich so wenige Beispiele mit Bildern gefunden ?! Ist doch immerhin OpenGL...) Übersicht zu den Möglichkeiten, wie man Oberflächen auf den Bildschirm zaubern kann, nennen?!?
    Am liebsten auf deutsch, da es dann einfacher ist, OpenGL-Fremdwörter von normalen Fremdwörtern zu unterscheiden ... Geht aber auch auf englisch ... besser als nichts.

    Ach ja, bevor ich es vergesse:
    Ich habe auch irgendwo gelesen, dass OpenGl die Normalenvektoren selbst berechnen kann. Das wäre schon nicht schlecht, oder spricht was dagegen?! Geht das mit allen Möglichkeiten/Vereinfachungen??

    Danke für jede Hilfe!
    Gruß
    OpenGl-Fifi



  • *Mit "Zeilenweise" meine ich z.B. "u erstmal festhalten und v abgehen" ...Hätte ich vielleicht eher so nennen sollen..



  • Ich stelle mir gerade optimal vor, einfach ein Quad durch den Tesselator zu schicken und die Funktion im Shader auszuwerten...

    Auf herkömmliche Weise wäre ein indizierter Quadstrip wahrscheinlich das effizienteste... Also Du legst Deine Punkte in einen Buffer und indizierst dann im Strip nur. Knapp 2 Integer-Indizes pro Primitiv, Punkte werden nur einmal übertragen... Wenn Du die Funktion im Vertex-Shader auswertest, kannst Du die Buffer einmal initialisieren und für verschiedene Funktionen wiederverwenden.

    Früher waren das glaube ich VertexArrays, jetzt sind's eben nur Buffer, die Namen merke ich mir leider nie.

    Sowas wie Quadplane gibt's nicht, kenne ich zumindest nicht.



  • Jup, Danke für die Nachricht. Das klingt alles nachvollziehbar.
    Weißt du (oder jemand anderes) zufällig, wie das mit dem automatischen berechnen der Normalen funktioniert?! Ich weiß nichtmal, wie OpenGl das genau macht. Werden beim Quad pro Fläche alle Kanten dazu genutzt, oder wie??
    Naja, wenn ich ne Normale pro Vertex haben möchte, dürfte beim Quad-Strip ja nicht das Gleiche, wie beim theoretischen "Quad-Plane" heraus kommen, oder?!



  • Hast Du die Möglichkeit, die Normale aus der Funktion abzuleiten?



  • Das ließe sich machen, wenn's denn sein muss.. Man hat ja die Wahl zwischen "flat" und "smooth". Ich weiß aber nicht, was OpenGL da intern anders macht.
    Ist meine Vorstellung denn richtig, dass es in OpenGl eigentlich keine Flächennormalen gibt, sondern nur welche pro Vertex?! D.h. so wie ich das sehe, brauche ich dann, um Flächennormale zu erhalten, eine einzige Normale für alle, an die Fläche angrenzenden Vertices. So weit, so klar, aber ich weiß nicht, was ich dann mit Vertices machen soll, die zu mehreren Flächen gehören..

    Mal noch was anderes. Ich habe gelesen, dass Polygone immer konvex sein sollen. Das ist für Quads aber nicht immer der Fall, wenn man sie ungünstig betrachtet.
    Also dann doch Dreiecke?! Mir wärs allerdings am liebsten, wenn man das umgehen könnte, da ich mich dann nicht entscheiden muss, ob ich

    __         __
    |\ |       | /|
    |_\|, oder |/_|
    

    aus den Quads machen soll. Und die Mathesoftware macht das auch mit Quads statt mit Dreiecken..



  • Wenn Du z(x,y) hast, kannst du aus einem regelmäßigen gitter keine konvexen quads erzeugen.
    OpenGL kennt jetzt eigentlich gar keine Normalen mehr... aber es bietet sich oftmals an, die Normalen an den Eckpunkten zu berechnen und dann über die Fläche zu interpolieren (=ehemals "smooth"). Da in Deinem Fall die Normalen an den Punkten eindeutig sind (sich aus der Funktion ergeben), ergibt sich kein Problem mit mehrfach verwendeten Punkten.
    Und ja, es wird zu "Artefakten" kommen, weil es nur bei einem ebenen Viereck "egal" ist, wie man es in Dreiecke zerteilt (und am Ende wird OpenGL so oder so zwei Dreiecke daraus machen btw).



  • Erster Satz konxex -> konkax. Wobei ich hier die Innenwinkel der Eckpunkte meine und nicht die Eigenschaft der Oberfläche, deren Teil das Viereck ja sein wird.



  • Sollten bei einem Quad nicht alle Eckpunkte in einer Ebene liegen? Das wäre hier ja nicht der Fall.


Anmelden zum Antworten