Wohin mit glNormal???
-
Hi Leute...
Folgendes Problem:
Ich habe in einem 'glBegin( GL_TRIANGLE_STRIP ) ... glEnd()' Block eine Schleife, die mir folgendes zeichnet.0 ----> 1 // erst die beiden -> neuer Schleifendurchgang / / / 2 ----> 3 // dann die beiden -> neuer Schleifendurchgang / / / 4 ----> 5 // dann die beiden -> und wieder neuer Schleifendurchgang / / / ...
Heisst, dass ich alle Punkte in einem Array habe, und ich mir eine Schleife gebaut habe, die pro Schleifendurchgang zwei Punkte setzt. Alle werden dann eben zu Dreiecken verbunden. Soweit so gut.
Jetzt weiss ich aber nicht, wo genau ich immer die Normalen berechnen und mit glNormal setzen muss?
Kann mir jemand helfen?
Danke fuer alle Antworten.
MfG Aoeke
-
Bei DX würde man das einfach alles in einen (oder mehrere) VB knallen, nimm einfach das gleiche nur für OGL!
Bye, TGGC
-
für gewöhnlich berechnet man für jedes dreieck eine normale
bei opengl kann man für jeden "vertex" eine angeben indem man vor glVertex glNormal setzt, da sich bei GL_TIRANGLE_STRIP 2 Dreicke 2 eckpunkte teilen hast du ein problem. Ich bin mir nicht ganz sicher was opengl da macht, würd mich aber mal interessieren.
-
@TGGC:
sowas wäre auch der einfachste weg. nur einen nachteil hat die sache: nicht jede GraKa unterstützt die OpenGL VertexBuffer Objekte.Am besten mit den glDraw... Funktionen, die funzen überall.
-
Ja daran habe ich dann auch gedacht. Da ich da aber noch nicht ganz durchblicke weiss ich nicht, wie die einzelnen Arrays dann aussehen muessen.
Ich habe mir das jetzt so gedacht:float Vertices[anzahl][3] float TexCoord[anzahl][2] float Normals[????][3]
Habe halt nur keine Ahnung, wieviele Werte ich bei den Normalen brauche. Theoretisch ja 'anzahl-2', weil ich ja dann soviele Dreiecke habe. Oder?
MfG Aoeke
-
Für jedes Vertex ein Normal-Vektor. Sonst hast du wenn du pro Triangle
ein Normal nimmst FlatShading und das sieht besonders bei runden Formen
grausam aus.
-
Aber wie soll ich fuer einen einzigen Punkt einen Normalvektor berechnen? Und ein Punkt haette ja dann auch zwei Normalvektoren, weil er ja als Punkt fuer zwei Dreiecke gilt. Oder habe ich da was falsch verstanden?
MfG Aoeke
-
Patrick schrieb:
@TGGC:
sowas wäre auch der einfachste weg. nur einen nachteil hat die sache: nicht jede GraKa unterstützt die OpenGL VertexBuffer Objekte.Am besten mit den glDraw... Funktionen, die funzen überall.
aber jede graka unterstützt interleavedvertexbuffer....
rapso->greest();
-
@rapso
sofern wie ich weis keine Voodoo karten und alte ATI karten.
-
dass eine graka die keinen opengl treiber hat (nur MiniGL), einen opengl befehl nicht ausführt... hmm... wozu die aussage?
und wo ich gerade am rumklugscheissen bin
Abbadon schrieb:
für gewöhnlich berechnet man für jedes dreieck eine normale
bei opengl kann man für jeden "vertex" eine angeben indem man vor glVertex glNormal setzt, da sich bei GL_TIRANGLE_STRIP 2 Dreicke 2 eckpunkte teilen hast du ein problem. Ich bin mir nicht ganz sicher was opengl da macht, würd mich aber mal interessieren.ich weiß nicht woher du deine definition von "normal" hast, aber es gibt zig wege normalen zu berechnen. bei opengl ist es nicht 100%ig definiert was mit einer normalen passiert. in den meißten fällen sollte die normale jedes vertices dafür genutzt werden um die intensität der beleuchtung für den vertex auszurechnen und dann auf einem poly zwischen deren vertices zu interpolieren.
es kann sein dass einige implementationen von opengl keine beleuchtung durchführen (die normale ignorieren), einige könnten die normale pro poly nutzen und flat shaden (ich glaube alte matrox karten machen das) und es gibt auch raytracer die eine phong beleuchtung durchführen mittels der normale, sie interpolieren also die normale und führen eine intensitätsberechnung pro pixel durch.
bei programmen wie z.b. 3dsmax gibt es mehrere normalen pro vertex, dort gibt es dann smoothgroups, dadurch ist dein begriff von "normal" noch weiter entfernt.
es gibt programme die pro vertex nur einmal eine normale mit einer bestimmten richtung pro vertexauf addieren (um dann mittels durchschnitt die vertexnormale zu erhalten). mache kommen auf die vertexnormale indem sie normalisierten normalen der angrenden polys aufaddieren, manchmal sind die noch normalisiert. beim bumpmapping werden die normalen aus texturen ausgelesen, bei terrain kann man sie mittels steigung errechnen (schneller als kreuzproduckte angrenzender polys zu nutzen).so, genug ge[/klugscheiss]t
rapso->greets();