Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 11:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glTexEnv - Probleme beim Skalieren
BeitragVerfasst: Do Feb 19, 2009 14:09 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Irgendwie bekomme ich meine Objekte nicht richtig dargestellt. Hier eine simple Testtextur, die mit der Einstellung

Code:
  1. glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);


natürlich in ihren normalen Farben erscheint:

Bild

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:

Bild

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:

Bild

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?

Hier die Sequenz zum Zeichnen:

Code:
  1.     glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  2.     glColor4f (1,1,1,1);
  3.     glNormal3f (normal.x, normal.y, normal.z);
  4.     glPushMatrix ();
  5.         glTranslatef (pos.x, pos.y, pos.z);
  6.         glRotatef    (rot.x, 1, 0, 0);
  7.         glRotatef    (rot.y, 0, 1, 0);
  8.         glRotatef    (rot.z, 0, 0, 1);
  9.         glScalef     (scale.x, scale.y, scale.z);
  10.        
  11.         glCallList (SpriteList); // zeichnen mit Display-Liste
  12.     glPopMatrix ();
  13.  


... und die OpenGL-Einstellungen:

Code:
  1.  
  2. glEnable (GL_TEXTURE_2D);
  3. glEnable (GL_DEPTH_TEST);
  4. glDisable (GL_CULL_FACE);
  5. glEnable (GL_LIGHTING);
  6. glDisable (GL_NORMALIZE);
  7. glEnable (GL_ALPHA_TEST);
  8. glEnable (GL_BLEND);
  9. glDisable (GL_STENCIL_TEST);
  10. glDisable (GL_TEXTURE_GEN_S);
  11. glDisable (GL_TEXTURE_GEN_T);
  12. glDisable (GL_COLOR_MATERIAL);
  13.  
  14. glDepthMask (GL_TRUE);
  15. glShadeModel (GL_SMOOTH);
  16. glDepthFunc (GL_LESS);
  17. glAlphaFunc (GL_GEQUAL, 0.5);
  18.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 19, 2009 18:55 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 19, 2009 21:42 
Offline
DGL Member
Benutzeravatar

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).

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 11:01 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 20, 2009 18:44 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]