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

Aktuelle Zeit: Fr Jul 18, 2025 14:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Nov 24, 2005 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Moin ...

Ich bin gerade dabei in meinem Spiel Schatten zu implementieren ...

kurz zum Aufbau des Spiels:
In einem Terrain fliegen unterschiedlich große Bälle durch die Gegend ...

Bei der Suche nach Schattenalgorithmen bin ich auf die Technik der Stencil Volume Schatten aufmerksam geworden.
Ich habe mir gedacht, da ich mit meinem Terrain einen Teil einer Welt darstellen möchte kann ich auch eine feste Lichtrichtung nehmen und brauche mich nicht weiter um die Lichtposition zu kümmern.
Das erleichtert die Berechnung der Schatten-Volumen um einiges.
Da ich ausschließlich Spheres als Objekte habe, die Schatten werfen ist das Volumen durch die parallelen Lichtstrahlen ein schräger Zylinder mit dem gleichen Radius wie die Sphere...
Diesen Zylinder zu berechnen ist kein großes Problem, die Berechnung ist auch richtig...
Der große Vorteil: da sich die Lichtrichtung nicht ändert, kann ich die Schatten-Volumen vorberechnen, da sie sich auch nicht ändern...

Wenn ich jetzt allerdings die Scene mit den Schatten render, bricht meine Framerate von 60-70 fps auf 0-4 fps ein ... ob auch Schatten gezeichnet werden, weiß ich nicht, das kann ich mir bei 0-4 fps schlecht angucken *g*

ich benutze folgenden Code um die Scene mit Schatten zu rendern ...

Code:
  1.  
  2.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  3.     glLoadIdentity();
  4.     m_Camera.Move();
  5.    
  6.     // normale Scene rendern (zu testzwecken nur einen ball)
  7.     glCullFace(GL_BACK);
  8.     m_Terrain.DrawTerrain(terType);
  9.  
  10.     m_pBalls[0].DrawBall();
  11.  
  12.     glDepthMask(GL_FALSE);
  13.     glDepthFunc(GL_LEQUAL);
  14.  
  15.     glEnable(GL_STENCIL_TEST);
  16.     glColorMask(0,0,0,0);
  17.     glStencilFunc(GL_ALWAYS,1,0xFFFFFFFF);
  18.  
  19.     glStencilOp(GL_KEEP,GL_KEEP,GL_INCR);
  20.     glCullFace(GL_BACK);
  21.  
  22.     // Schattenvolumen rendern
  23.     glPushMatrix();
  24.     CVector3 p = m_pBalls[0].GetPos();
  25.     glTranslatef(p.x,p.y,p.z);
  26.     glCallList(m_pBalls[0].GetShadowVolume());
  27.     glPopMatrix();
  28.  
  29.     glCullFace(GL_FRONT);
  30.     glStencilOp(GL_KEEP,GL_KEEP,GL_DECR);
  31.    
  32.     // Schattenvolumen rendern
  33.     glPushMatrix();
  34.     p = m_pBalls[0].GetPos();
  35.     glTranslatef(p.x,p.y,p.z);
  36.     glCallList(m_pBalls[0].GetShadowVolume());
  37.     glPopMatrix();
  38.  
  39.     glColorMask(1,1,1,1);
  40.     // blended ein schwarzes quad über den ges. bildschirm
  41.     RenderShadow();
  42.  
  43.     glDepthFunc(GL_LEQUAL);
  44.     glDepthMask(GL_TRUE);
  45.     glDisable(GL_STENCIL_TEST);
  46.  


Ich habe mitlerweile Codes aus ca. 10 verschiedenen Tutorials benutzt und immer wieder verglichen, aber das hat nie was geändert ...
Wenn ich mir Beispielprogramme runterlade, die den gleichen Code benutzen funktionieren die einwandfrei...
Daher dachte ich, das läge evtl an der Komplexität des Terrains, aber wenn ich das Terrain nicht render ändert sich auch nichts an den 0-4 fps ...

Ich hoffe mir kann da jemand helfen, denn auf projected stencil shadows möchte ich nicht zurückgreifen, das ist mir zu kompliziert bei nem terrain ...
und nach Möglichkeit keine Links zu tutorials posten, die kenn ich eh schon alle ;) sitz schon den ganzen Tag an den dingern und hab noch nichts geschafft .. bin total fertig *g*

schonmal danke im voraus

Gruß
Shai

[edit]
Ich habe gerade noch ein bißchen was ausprobiert und dabei ist mir aufgefallen, dass wenn ich den Aufruf von RenderShadow() auskommentiere ich wieder die alte frame-zahl habe.
außer die Kugel ist im Bild, dann bricht er wieder ein ...
wenn ich dann noch das rendern der schatten-volumen auskommentiere ist alles wieder beim alten ...
d.h. er hat irgend ein problem damit in den stencil-buffer zu schreiben

die Kugel und das schatten-volumen der kugel sind übrigens in einer Display-liste gespeichert ...
[/edit]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 16:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Ich bin mir nicht 100% sicher, aber ich glaube, dass heute Grafikkarten den Stencilbuffer nur noch per Softwareemulation unterstützen (hab ich irgendwann mal irgendwo gelesen), das dürfte den Framerateeinbruch erklären.

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 16:28 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Ich bin mir nicht 100% sicher, aber ich glaube, dass heute Grafikkarten den Stencilbuffer nur noch per Softwareemulation unterstützen (hab ich irgendwann mal irgendwo gelesen), das dürfte den Framerateeinbruch erklären.
:shock: Das kann ich aber nicht nachvollziehen.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 16:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Warum nicht ?
Wenn die GraKa keine Stencilbuffer mehr unterstützt schaltet der Treiber eben auf Softwareemulation um und dann wird eben
alles auf dem Prozessor berechnet.
Ich schätze mal, dass der Stencilbuffer gecancelt wurde, da man den gleichen Effekt auch mit Pixelshadern und PBuffern
hinkriegt, aber das ist nur eine Theore von meiner Seite.

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Kann mich dem auch nicht anschließen, da im Core 2.0 eine Erweiterung für den Stencil Test eingeflossen ist. Ist also ziemlich unwahrscheinlich, dass der auf der CPU abläuft. Warum sollte der sonst erweitert werden, wenn nicht um noch mehr power raus zu holen?

Shaijan: Evtl könnte die Extension auch was für dich sein. Die wurde wohl unter anderem auch für Stencil Shadows implementiert.

Aber um auf dein Problem zu kommen. Es kann natürlich sein, dass deine Grafikkarte keinen Hardware StencilBuffer unterstzützt. Ich meine Speziell ältere Grafikkarten haben keinen Hardware Buffer. Um das heraus zu finden solltest du wohl am Besten mal eine ganz simple Anwendung machen in der nen recht simplen Stenciltest benutzt. In etwa so etwas wie in diesem Tutorial. Also das Oben mit dem Flugzeug. Wenn das auch langsam ist, dann wird deine Karte das nicht unterstützen. Was hast du eigentlich für eine?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 16:58 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Nein, das der Stencilbuffer nur noch SW ist, kann ich nicht glauben. Was soll denn Doom III dann sagen.

Der Code sieht so weit auf den ersten Blick ganz gut aus.
Hast du denn den Stencilbuffer auch eingerichtet? In manchen Templates is der ausgeschaltet, weil er nicht benötigt wird. Da gibts im PixelFormatDescriptor so ein cStencilBits Byte, dass sollte nicht 0 sein.
Evtl könnte das auch mit nem seeeehr großem Viewport zusammen hängen. Das dürfte zwar eigentlich nicht solche Auswirkungen haben, aber über was für Auflösungen reden wir hier?

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 17:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
In dem Tool glView gibt es auch eine Übersicht über alle Pixelformate. Unter anderen sind Color, Depth, Stencil und Accumulation Bits angegeben. Außerdem steht bei jedem dabei ob diese in der Hardware unterstützt werden oder nicht. Evtl solltest du mit diesem deiner Grafikkarte ma näher rücken und schauen.

Wenn ich mich recht entsinne kann es auch sein, dass ältere Grafikkaten probleme mit 8 Bit (oder wars 1 Bit) Stencil haben. Weiß nicht mehr welchen ist zu lange her. Und wenn man dann einen 1 Bit eingestellt hatte wars langsam. Dann musste man 8 Bit benutzen. Evtl solltest du auch mal schauen wie viel Speicher deine Grafikkarte hat und ob das mit dem Speicher überhaupt hinhauen kann. Wie Al sagte. Es kann durchaus auch sein, dass deiner Karte der Speicher ausgeht, weil das alles zu groß ist. Evtl genügt es dann auch schon auf 16 Farbtiefe runter zuschrauben und keinen 32 Bit Depthbuffer zu verwenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

lag an dem PixelFormatDescriptor, da war der StencilBuffer ausgestellt, wusste nicht, dass man den explizit aktivieren muss ... danke für den Tip ...

jetzt müssten die Schatten nur noch funktionieren ... *grmpf* ;)

noch zur Info (bitte nicht lachen)
habe eine alte GF2MX ... aber nach weihnachten wird aufgerüstet ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Shaijan hat geschrieben:
noch zur Info (bitte nicht lachen)
habe eine alte GF2MX ... aber nach weihnachten wird aufgerüstet ;)


Habe Jahre lang mit ner TNT2 gearbeitet bis die Radeon 9500 raus kam. :-D
Da muss man sich wenigstens noch Gedanken machen was man programmiert. Das ist heutzutage leider nicht mehr so der Fall.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 19:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hab die Schatten jetzt hinbekommen, nochmal danke für die Hilfe ...

jetzt habe ich nur noch ein Problem:
das Schatten-Volumen ...

Wie oben schon beschrieben benutze ich einen einfachen zylinder ...
diesen berechne ich allerdings falsch ...

so sieht der code aus:
Code:
  1.  
  2. glBegin(GL_TRIANGLE_STRIP);
  3. {
  4.     for(int i=0;i<=res;i++)
  5.     {
  6.         a = i * b;
  7.         x = sinf(a) * m_fRadius;
  8.         z = cosf(a) * m_fRadius;
  9.         glVertex3f(x,0.0f,z);
  10.         glVertex3f(x + lightDir.x,lightDir.y,z + lightDir.z);
  11.     }
  12. }
  13. glEnd();
  14.  


lightDir ist dabei ein Vektor mit
x = 127.5
y = -255.0
z = 127.5

er gibt sozusagen die Richtung des Lichts an und gewährleistet, dass das Schattenvolumen sehr lang ist ...

in der angehängten Grafik könnt ihr sehen, was dasProblem ist...
der Weiße zylinder ist der, den ich derzeit generiere ... den gelben möchte ich haben (hoffe man kann alles gut erkennen, keine supere detailierte zeichnung ... ich weis *g*)

hoffe mir kann da jemand helfen

Gruß
Shai


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 25, 2005 19:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Aha, habs schon selber rausgefunden ...

und zwar berechne ich einfach den Winkel zwischen licht-vektor und dem vektor (0|-1|0) (neg. y-richtung)
mit dem winkel kann ich dann jeden vektor des zylinders (normal und nicht versetzt berechnet) um die z-achse an seinen angestammten platz drehen ...

gruß
Shai


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 26, 2005 19:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

hab da noch ein problem ...

und zwar habe ich nem kumpel das spiel mal rübergeschickt zum testen ...
allerdings funktionieren bei ihm die schatten nicht...
er hat eine ATI Mobility Radeon 9000 oder so ... damit sollte das doch eigentlich gehen ...

weiß jemand woran das liegen könnte?

Gruß
Shai


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 27, 2005 15:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Eventuell wieder das Problem mit dem Stencilbuffer? Vielleicht unterstützt seine Graka weniger als deine. (unwahrscheinlich...)

Aber...hmm...ATI...die haben bei mir mal bei so projektiven Texturen und so an der UNI, ne Menge probleme gemacht.... Löscht du eigentlich auch schön die Stencilbits am Anfang?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 27, 2005 16:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

ja, die lösch ich, vor jedem rendern ein aufruf von glClear mit GL_STENCIL_BUFFER_BIT

hmm ...
Wir haben seine Graka mal mit glView untersucht und uns die einzelnen PixelFormate angeschaut, die seine Graka unterstützt...
Er hat bei jedem PixelFormat 8 bits für den Stencilbuffer ... ich nur bei wenigen ... also sollte das ja auf jedenfall bei ihm laufen ...
neue treiber bekommt er komischerweise nicht installiert, die erkennen seine graka wohl nicht richtig ...

komisch ...

gruß
Shai


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Nov 27, 2005 17:03 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
Jupp, mobile radeons mögen keine stanard-catalyst-treiber. es gibt aber tools, die die treiber verändern, so dass sie anerkannt werden. ohne ein backup des original-treibers sollte man das aber nicht versuchen ;)

Ich weiss jetzt leider gerade nicht, wie das tool heisst....

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.009s | 15 Queries | GZIP : On ]