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

Aktuelle Zeit: Fr Jul 18, 2025 15:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 24 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Feb 23, 2006 14:02 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Hallo,

Mein nächstes Problem. Ich habe einen Quader, der sich durch eine teilweise transparente Textur bewegt. Damit nicht entweder die komplette Textur vor oder hinter dem Quader ist, muss ich dazu den Tiefentest anlassen. Dadurch fangen meine Texturen das flackern an.
Wie löst man so etwas elegant in OGL?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 14:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wenn du zu erst den Quader zeihnest und dann mit Tiefentest das Transparente objekt sollte es keine Probleme geben, da die Textur teilweise beschnitten wäre. Also vom Tiefentest.

Vorrausgesetzt ich habe dein Problem richtig verstanden. Da bin ich mir nämlich gerade nicht so sicher. Bin heute nicht so ganz Aufnahmefähig. :-(

Zur Not häng mal nen Bild an. Das ist eigentlich immer eindeutig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 14:47 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Hier einmal ein Bild.

Die Quader sind besagte Quader. Das Weisse und das Graue sind die beiden teils transparenten Texturen (soll einen Drehscheibe sein) und diese flackern. Ich zeichne bereits erst die Quader und dann die beiden Objekte.


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 15:31 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Ich glaube ich hab den Fehler gefunden. Ich hatte ColorBits auf 32 und Z-Buffer auf 24 stehen. Wenn ich beide auf 0 in CreateRenderingContext setze, ist das flackern fast weg. Vermutlich hat er einfach zu lange gebraucht zum Umrechnen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 15:39 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
zu früh gefreut - jetzt bekomme ich streifen in der Textur (siehe Bild)


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 22:11 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm...Ich glaube das solltest du dringend wieder umändern. Weil Colorbits sagt wieviele Bits benutzt werden um Farben darzustellen. 32 = 4*8 = RGBA. Und durch die 0 Beim Z-Buffer hast du den Tiefenpuffer unbrauchbar gemacht. Theoretisch(!) würde es jetzt aich nix mehr bringen den Tiefentest zu aktivieren, weil ja jetzt pro Pixel 0 Tiefeninformationen gespeichert sind.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 08:48 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
also, ich hab mittlerweile mit beiden Werten gespielt. Das verhalten hängt eigentlich nur an den Tiefenbufferbitwerten. Ich hatte gedacht 0 bei beiden Einstellungen könnte die default bzw. Desktop-Werte nehmen (da ich im Fenster render). Colorbits hab ich wieder auf 32, und wenn ich Tiefenbuffer auf 16 stelle, bekomme ich die oben gezeigten Streifen. Setz ich ihn auf 24 flackern komplette Teile der Textur.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 08:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Da kann ich dir nicht ganz zustimmen. Diese Angaben sind nur ein Vorschlag für den Grafiktreiber. Er kann sich auch darüber hinwegsetzen und die ein ganz anderes verpassen. Als Colorbuffer bekommst du eigentlich grundsätzlich immer das was im Windows eingestellt ist. Ich habe es auch gerade mal mit 0 / 0 und 16 / 8 (Color / Depth) Ausprobiert und habe immer 5 zurückbekommen. Also 32 / 24. Das muss aber nicht immer so seit. Die Wahrscheinlichkeit dafür ist aber rechthoch. Ich meine auf älteren Karten ließ sich so auch die Aufläsung des Z-Buffers beinflussen. Es bietet sich aber an sinnvolle oder gewünschte Werte dafür anzugeben. Eben um auch wenig Interpretationsreiheit für den Treiber zu lassen.

Zu dem Problem. Das sieht fast aus wie ZFighting. Fast. Besteht diese Drehscheibe aus zwei Quads? Wenn du mit LEQUAL als Tiefentest arbeitest dann sollte es eigentlich nicht passieren. Da diese wirklich 100%tig aufeinander liegen werden die dann auch so gezeichnet. Aber ich befürchte ohne Code wird das auch nichts. So ist das mehr oder weniger nur ne Rateaktion.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 09:39 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
dem kann abgeholfen werden.

Wird für den Frame aufgerufen wenn er erstellt wird.
Code:
  1.  
  2. procedure TFrame1.onCreate(const appPath : string);
  3. begin
  4.   if isInitialized=False then
  5.   begin
  6.     applicationPath:=appPath;
  7.     DC:=GetDC(Handle);
  8.     if not InitOpenGL then Application.Terminate;
  9.     RC:=CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
  10.     ActivateRenderingContext(DC,RC);
  11.     SetupGL();
  12.     Init();
  13.   end;
  14.   isInitialized:=True;
  15. end;
  16.  


die Passende SetupGL:
Code:
  1.  
  2. procedure TFrame1.SetupGL;
  3. begin
  4.   glClearColor(0,0,0,0);
  5.   glClearDepth(1.0); // Depth Buffer Setup
  6.   glEnable(GL_DEPTH_TEST); // Enables Depth Testing
  7.   glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do
  8.   glEnable(GL_CULL_FACE); //enable backface-culling
  9.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //für alpha-blending
  10.   glEnable(GL_BLEND); //und anschalten
  11.   //glHint(GL_LINE_SMOOTH,GL_NICEST);  //AntiAliasing
  12.   //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  13. end;
  14.  


Die Quader:
Code:
  1.  
  2. procedure TPodium.render;
  3. var
  4.   realPosition : TPosition;
  5. begin
  6.   farbe.setGLColor;
  7.   realPosition:=position;
  8.   if antrieb<>nil then realPosition[1]:=antrieb.istPosition;
  9.   translatef(realPosition);
  10.   rotatef(winkel);
  11.   glScalef(breite, hoehe, tiefe);
  12.   renderEinheitsWuerfel(true);
  13. end;
  14.  

wobei renderEinheitsWuerfel(true) einen Würfel mit Kantenlänge 1 zentriert um (0,0,0) rendert. True bedeutet, dass noch ein Rahmen dazugezeichnet wird.

Die Scheiben:
Code:
  1.  
  2. procedure TScheibe.renderAlpha;
  3. begin
  4.   //glDisable(GL_DEPTH_TEST);
  5.   if antrieb<>nil then winkel[1]:=antrieb.istPosition*10;
  6.   glTranslatef(position[0], position[1], position[2]);
  7.   glScalef(size,1,size);
  8.   renderQuad(fNegativTexture);
  9.   glRotatef(winkel[1],0,1,0);
  10.   renderQuad(fTexture);
  11.   //glEnable(GL_DEPTH_TEST);
  12. end;
  13.  

renderQuad -> zentrierter EinheitsQuad um (0,0,0) in der x-z-Ebene

fTexture und fNegativTexture sind glBitmaps von Lossey (danke dafür).

Um es nicht zu vergessen: nearClip ist 1, farClip ist 50


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 09:46 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Danke - ZFighting war der richtige Tip!

ich hab den Code hier auf folgendes geändert:

Code:
  1.  
  2. procedure TScheibe.renderAlpha;
  3. begin
  4.   //glDisable(GL_DEPTH_TEST);
  5.   if antrieb<>nil then winkel[1]:=antrieb.istPosition*10;
  6.   glTranslatef(position[0], position[1], position[2]);
  7.   glScalef(size,1,size);
  8.   renderQuad(fNegativTexture);
  9.   glTranslatef(0,0.001,0); //Eingefügte Zeile
  10.   glRotatef(winkel[1],0,1,0);
  11.   renderQuad(fTexture);
  12.   //glEnable(GL_DEPTH_TEST);
  13. end;
  14.  


und es funktioniert!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 10:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dann scheinen sich also bei der Rotation auch minimalste Abweichungen einzuschleichen. :-(

Evtl könntest du da auch mit PolygonOffset arbeiten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 10:03 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Was meinst du mit den Abweichungen?

btw, das spannende an der Sache ist - wenn ich keine Quader durch die Texturen laufen lasse, wird das ganze ohne Flackern gerendert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 10:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Abweichung. Na ja. Wenn du die Punkte direkt übereinander legst, dann stimmen alle texel der Fläche mit der darunterliegenden überein. Wenn du jetzt aber die eine Fläche rotierst dann muss OpenGL ja die Ecken (Vetices) rortieren und dann sollten sie normal auch alle die Selbe Tiefe haben. Das scheint aber nicht der Fall zu sein, da sie sonst ja nicht nach hintengeschoben werden würde. Und die Änderung an deinem Code spricht eigentlich auch dafür, dass dort beim Rotieren die Fläche wohl minimal nach hinten gesetzt wurde.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 10:45 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Danke auf jeden Fall für die Hilfe und die Erklärung.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 24, 2006 10:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das mit der Abweichung ist eher nur ne Vermutung. ;-)


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


Wer ist online?

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