OpenGL: Licht an, Farbe und Transparenz aus??
-
ich ergere mich schon ziehmlich lange
Es waere nett wenn Du Dir ein bischen mehr Muehe mit der Rechtschreibung geben koenntest.
-
Hallo
hellihjb schrieb:
ich ergere mich schon ziehmlich lange
Es waere**,** nett wenn Du Dir ein bischen mehr Muehe mit der Rechtschreibung geben koenntest.
:p
chrische
-
ab hier wieder nur noch on topic 
-
Andreas XXL schrieb:
Muss ich etwa jedes Vertex in einer for-Schleife durchlaufen und dann für jedes die Material Farb und Alpha Werte setzten?
Wenn diese Vorgehensweise die richtige ist (wie gesagt kenn ich mich beim konkreten Problem nicht aus) mußt du die Werte nur neu setzen wenn sie sich wirklich ändern.
Jep, wenn du Vertexdaten durch die Pipeline schickst, wird immer mit den aktuell gesetzten Werten für die jeweiligen Parameter gearbeitet, ob die Daten dabei aus einem manuellen glVertex**()-Aufruf kommen oder aus einem Vertexbuffer ist unerheblich. Die einfachste Vorgehensweise ist, deinen Mesh in Teile jeweils genau einen Materiales aufzuspalten. Für jedes Teil wird dann ein eigener Vertexbuffer angelegt, beim Rendern die jeweiligen Material-Parameter gesetzt und schlußendlich der Vertexbuffer aufgerufen...
Grüße
Martin
-
Das ist echt Blöd

Das macht das Programm, wenn man für jedes Vertices eine eigene Farbe haben will, echt sau langsam. Dann kann man sich die VertexBuffer ja leich sparen.
-
wenn man für jedes Vertices eine eigene Farbe haben will, echt sau langsam
Du hast noch gar nicht verstanden, dass man die Material- & Beleuchtungseigenschaften nur *einmal* vorm zeichnen des *gesamten* Vertexbuffers setzt.
Es wuerde auch ueberhaupt keinen Sinn machen, diese Eigenschaften pro Vertex zu definieren, denn wie sollten die denn interpoliert werden?
Und wenn Du pro Vertex eine Farbe haben willst, dann nimmst Du eben eine Farbe mit in Deine Vertexstruktur auf. Diese fliesst dann (je nach Konfiguration von Material und Beleuchtung) mit in die Berechnung ein.
Hier steht das alles schoen beschrieben.
-
Also mit den Material Einstellungen funktioniert das ganze jetzt schon relativ gut.
Das mit den VertexBufferObjects und glColorPointer hab ich schon verstanden.
Aber wenn ich folgendes schreibe habe ich zwar die Farben, auch für jedes Vertices, aber gar kein Licht mehr:glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL);@hellihjb: Meinst du dass die Material-Einstellungen mit den Farben des ColorPointers des VBOs mit einflißen? Sodass man doch jedes Vertices bei Beleuchtung colorieren kann?
-
Wie bereits gesagt, das Licht allgemein funktioniert ja schon.
Aber das mit dem Einfließen in die Farbwerte jedes einzelnen Vertices scheint bei mir nicht zu funktionieren
Und das mit "glEnable(GL_COLOR_MATERIAL)" bewirkt bei mir nur, dass ich gar kein Licht mehr habe.
-
welche materialeigenschaften hast du gesetzt? (siehe link von mir)
-
Eigentlich so ziehmlich alles.
Für jedes Objekt: Diffuse Color, Ambient Color, Specular Color, Emission Color & Shininess.Also per:
float Color[4]; /* Color[0..3] = ... */ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Color); /* Rendern des Objektes */Aber folgender Code sorgt bei mir für gar keuin Lciht mehr (die Farben hab ich dann zwar aber eben kein Lciht mehr ^^)
glColorMaterial(GL_FRONT_AND_BACK, GL_EMISSION); glEnable(GL_COLOR_MATERIAL);
-
Ich weiß nicht was ich falsch mache

Das Licht ansich sieht ja gut aus.
Aber ich will auch dass alle Vertices ihre Farbe beim Beleuchten behalten.
In Blitz3D (DirectX 7) geht das sogar auch.
-
Kann mir denn keiner helfen??

Ich verstehe das Problem nicht?!
-
ENDLICH!

Ich hab's hinbekommen

Allerdings frage ich mich warum sich die Reihenfolge von Aufrufen von "glColorMaterial" unterschiedlich auswirkt?!
Ich hab das jetzt so:
glColorMaterial(GL_FRONT_AND_BACK, GL_EMISSION); glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT); glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
-
*hehe* gratuliere! endlich

aber ich glaube du hast noch nicht ganz verstanden was glColorMaterial macht bzw dass opengl eine statemachine ist.
wenn du dir die implementierung von glColorMaterial verbildlichen wuerdest, waere es in etwa
void glColorMaterial(int Status) { m_ColorMaterialStatus = Status; }damit haettest du quasi sowas geschrieben
glColorMaterial(GL_FRONT_AND_BACK, GL_EMISSION); glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT); glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); -> m_ColorMaterialStatus =GL_EMISSION; m_ColorMaterialStatus =GL_SPECULAR; m_ColorMaterialStatus =GL_AMBIENT; m_ColorMaterialStatus =GL_DIFFUSE;dann weisst du auch weshalb die reihenfolge etwas veraendert.
statusmachine kannst du dir so vorstellen, dass du einfach nur die variablen in dem treiber setzt. wenn du z.b. glEnable(blend); schreibst, ist es so als ob du im treiber
m_Blending=true;
schreiben wuerdest.
wenn du alle werte gesetzt hast und dann zeichnest, schaut sich opengl alle relevanten einstellungen von dir (einstellungen == states) an und arbeitet entsprechend denen die dreiecke, linien usw ab.aber dass du nie aufgibst ist

-
Danke

Und stimmt: jetzt versteh ich das richtig. Das ColorMaterial soll nur angeben was man nicht mit glMaterial sondern mit glColor setzt. Eben normalerweise nur Diffuse.
Okay ich hab's verstanden
Danke auch noch mal an alle