Damit kann ich nicht viel anfangen, weil die Normale unwirksam ist und es somit kein Shading gibt. Die Normale ist übrigens auf den Betrachter gerichtet (0, 0, 1), und das Licht steht hinter dem Betrachter (1, 1, 5).
Stelle ich nun die Texturumgebung auf GL_MODULATE um, habe ich die gewünschte Schattierung, doch das diffuse Licht wird umso schwächer, je größer ich das Teil skaliere:
Das Material für ambientes Licht ist hier auf (0, 0, 0, 0) gesetzt, so dass nur das diffuse Licht wirksam werden kann. Da die Objekte beliebig skaliert werden sollen, ist diese Abdunklung natürlich nicht tragbar. Wenn ich nun ein rotes, ambientes Material dazumische, kommt es zu einer entsprechenden Rotfärbung:
Mit anderen Worten: je größer ich das Objekt zeichne, desto schwächer wird die diffuse Beleuchtung, desto stärker schlägt das ambiente Licht durch. Doch wie kann ich erreichen, dass das diffuse Licht unabhängig von der Skalierung gleich bleibt?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ist das ein einzelnes Quad? Dann liegt das daran, dass er nicht mit dem Per-Vertex Lighting klarkommt. Je größer das Quad, desto größer ist auch der Abstand zwischen den Vertices, was zu einem unschönen Effekt sorgt. Lösungen:
Per Pixel Lighting (per Shader)
Mehr Vertices
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Jan 31, 2005 11:02 Beiträge: 432 Wohnort: Rheinlandpfalz
Wahrscheinlich liegt es an dem glScale()... das skaliert auch deine Normalen mit, sodass die Beleuchtung falsch berechnet wird.
Also entweder du berechnest von Hand neue (je nach Scale-Faktor), oder du machst nen glEnable(GL_NORMALIZE)...glDisable(GL_NORMALIZE).
Es liegt tatsächlich an glScale und den Normalen. Wenn ich die interne Normalisierung mit glEnable (GL_NORMALIZE) aktiviere, kommen die Texturen in jeder Größe richtig. Das möchte ich evtl. vermeiden und deshalb lieber selber skalieren. Nur die Display-Liste ist dadurch wahrscheinlich gestorben, oder?
Vielleicht auch eine Abwägung: Was wiegt schwerer, der Performanceverlust durch die interne Normalisierung oder der Performancegewinn durch die Display-Liste? Performance ist sehr wichtig, da etliche Tausende von Objekten in jedem Frame gerendert werden müssen.
Interessant ist folgendes: Wenn ich anstatt GL_NORMALIZE nach glScale und vor dem Zeichnen jedesmal die richtige Normale neu übergebe, nützt das nichts. Ich vermute, da meldet sich die Status-Maschine von OpenGL, d.h. dass glScale erst beim Zeichnen wirksam wird und nicht als Befehl aufzufassen ist, der an Ort und Stelle ausgeführt wird. Ich fall immer wieder drauf rein.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja, glScale verändert nur die Matrix. Und die wird offensichtlich auch auf die Normalen angewandt... Zur Performance kann ich dir nix sagen. Ich würde sagen, auf Antworten warten oder es selber ausprobieren, mit vielen Objekten, einem FPS-Counter (am besten auf basis von QueryPerformanceCounter) und den beiden Zeichenmethoden.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.