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

Aktuelle Zeit: Fr Jul 18, 2025 21:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Stencil Komplikationen
BeitragVerfasst: Di Okt 03, 2006 11:27 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi
Vielleicht habe ich ihn ja immernoch nich verstanden, selbst nach dem Spiegeltut und dem Sample von Jan mit den Rohren...
Naja schaut einfach ma

Code:
  1.  
  2.     OrthoStart;
  3.       glEnable(GL_STENCIL_TEST);
  4.       glStencilFunc(GL_ALWAYS, 1, 1);
  5.       glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  6.  
  7.       glEnable(GL_TEXTURE_2D);
  8.       FontManager.Draw('Particle','TEST',200,100);
  9.     OrthoStop;
  10.  

Das hier soll mir meine Font malen. In diesem Fall is die Farbe schwarz, aber die is ja auch irrelevant, denn diese Font soll als Maske dienen.

Code:
  1.  
  2.     // Blending aktivieren
  3.     glEnable(GL_BLEND);
  4.     glDisable(GL_DEPTH_TEST);
  5.     glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  6.  
  7.     glStencilFunc(GL_EQUAL, 1, 1);
  8.     glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  9.     Effekte[0].Advance(DrawTime);
  10.     glLoadIdentity;
  11.     glTranslatef(0,-1,-3);
  12.     Effekte[0].Render;
  13.  

Nu wird alles gezeichnet, was in der Font steht, die ja bereits in den Stencilbuffer geladen wurde.
Bin nich sicher ob da Keep oder Replace hinmuss, aber meiner Meinung nach Replace, denn wenn EQUAL soll ja ersetzt werden.

Das sollte meiner Meinung nach ausreichen. Leider zeichnet er aber ueberall alles. Als haette ich keine Maske geladen...

Danke schonma


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 03, 2006 12:39 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Habe mir jetz nochma Jans BSP ganz genau angesehen. Hoffe, ich habe es diesmal richtig verstanden, geht aber immernoch nich.
Code:
  1.  
  2.     glEnable(GL_STENCIL_TEST);
  3.  
  4.     OrthoStart;
  5.       glPolygonMode(GL_FRONT, GL_FILL);
  6.       glPolygonMode(GL_BACK, GL_FILL);
  7.       glStencilFunc(GL_ALWAYS, 1, 1);
  8.       glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  9.  
  10.       glEnable(GL_TEXTURE_2D);
  11.       FontManager.Draw('Particle','TEST',200,100);
  12.     OrthoStop;
  13.  

Hier soll dann die Schablone meines Fonts erstellt werden
So wie ichs verstanden hab, wird der Stencilpuffer nun an den Stellen, wo das Font ist, IMMER mit 1 gefüllt.
Bei den anderen nicht.

Code:
  1.  
  2.     glEnable(GL_BLEND);
  3.     glDisable(GL_DEPTH_TEST);
  4.     glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  5.  
  6.       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);    // Clear The Screen And The Depth Buffer
  7.       glStencilFunc(GL_EQUAL, 1, 1);
  8.       glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  9.       Effekte[0].Advance(DrawTime);
  10.       glLoadIdentity;
  11.       glTranslatef(0,-1,-3);
  12.       Effekte[0].Render;
  13.  

Hier soll mein Effekt innerhalb der Schrift erstellt werden.
So wie ich das verstanden habe, wird nun NUR dort gerendert, wo der Stencilpuffer EQUAL 1 ist.
Der Rest nicht

Tja wenn es so richtig ist, weiss ich nich, warums nicht funkt.
Vllt kann ja ma wer schreiben, ob nun dieses Verstaendnis oder das obige richtig ist, und eben was ich falsch verstanden habe ^^
Würds wirklich gern ma verstehen \";)\"

Danke


PS: Was mich allerdings am meisten irritiert ist folgendes:
Code:
  1.  
  2.       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);    // Clear The Screen And The Depth Buffer
  3.       glStencilFunc(GL_NEVER, 1, 1);
  4.       glStencilOp(GL_ZERO, GL_KEEP, GL_KEEP);
  5.       Effekte[0].Advance(DrawTime);
  6.       glLoadIdentity;
  7.       glTranslatef(0,-1,-3);
  8.       Effekte[0].Render;
  9.  

Nach meinem Verstaendnis bedeutet das, dass der Test nie bestanden werden kann, also der Effekt NIE gerendert werden würde, aber er wird ganz standartmäßig gerendert...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 03, 2006 19:54 
Offline
DGL Member
Benutzeravatar

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

finde jetzt keinen Fehler in deinem Code, aber hier sind noch ein paar mögliche Fehlerquellen:
1. ist beim zeichnen deines Effekts der Stencil Test wirklich aktiviert?
2. hast du vll irgendwo ein glClearStencil stehen in dem du den Leerwert auf 1 setzt?
3. hast du im Pixelformat deines Fensters den Stincilbuffer aktiviert?

weiterhin einige Sachen auf die du achten solltest:
1. wenn du den Stencilbuffer benutzt empfielt es sich (für gewöhnlich) diesen auch mit glClear(GL_STENCIL_BUFFER_BIT) zu leeren bevor du zeichnest
2. Die Funktion glStencilOp sagt nichts darüber aus, ob du auch zeichnest. Die bestimmt nur wie mit den Stencilbuffer verfahren wird.
Also ein GL_REPLACE an 1. Stelle sagt: bei erfolgreichem Stenciltest (bestimmt durch glStencilFunc) ersetze Stencilbuffer durch ref in glStencilFunc
ein GL_REPLACE an 2. Stelle sagt: bei misslungenem Depth-Test ersetze stencilbuffer
ein GL_REPLACE an 3. Stelle sagt: bei gelungenem Depth-Test ersetze Stencilbuffer
d.h. wenn du nachdem du deine Schablone erst einmal erstellt hast, echt zeichnest, brauchst du kein GL_REPLACE mehr irgendwo, GL_KEEP reicht vollkommen ...

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 10:13 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Shaijan hat geschrieben:
1. ist beim zeichnen deines Effekts der Stencil Test wirklich aktiviert?

Jap sieht man ja im ersten Codebsp ^^
Shaijan hat geschrieben:
2. hast du vll irgendwo ein glClearStencil stehen in dem du den Leerwert auf 1 setzt?

Nope hab ich nich
Shaijan hat geschrieben:
3. hast du im Pixelformat deines Fensters den Stincilbuffer aktiviert?

Pixelformat meines Fensters?

Shaijan hat geschrieben:
1. wenn du den Stencilbuffer benutzt empfielt es sich (für gewöhnlich) diesen auch mit glClear(GL_STENCIL_BUFFER_BIT) zu leeren bevor du zeichnest

Mach ich am Anfang, wo ich auch den Farb- und Tiefenbuffer leere.

Shaijan hat geschrieben:
2. Die Funktion glStencilOp sagt nichts darüber aus, ob du auch zeichnest. Die bestimmt nur wie mit den Stencilbuffer verfahren wird.
Also ein GL_REPLACE an 1. Stelle sagt: bei erfolgreichem Stenciltest (bestimmt durch glStencilFunc) ersetze Stencilbuffer durch ref in glStencilFunc
ein GL_REPLACE an 2. Stelle sagt: bei misslungenem Depth-Test ersetze stencilbuffer
ein GL_REPLACE an 3. Stelle sagt: bei gelungenem Depth-Test ersetze Stencilbuffer
d.h. wenn du nachdem du deine Schablone erst einmal erstellt hast, echt zeichnest, brauchst du kein GL_REPLACE mehr irgendwo, GL_KEEP reicht vollkommen ...
Jo hab ich jetz verstanden. Wenn ich jetz aber ausserhalb meiner Schablone zeichnen wollte müsste ich doch theoretisch ein
GL_NEQUAL mit GL_REPLACE kombinieren oder?

Ansonsten weiss ich jetz echt nicht mehr, warums immernoch net geht...

EDIT: Bin grad in der Schule, aber wenn ich heim bin, werde ich direkt den gesamten Quellcode nochma schicken, vllt isses ja wieder ein ganz dummer Fehler...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 11:05 
Offline
DGL Member
Benutzeravatar

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

irgendwo wirst du ein Fenster erstellen, in dem du dann später mit OGL etwas ausgeben möchtest.
Beim Erstellen dieses Fensters wird ein Pixelformat angegeben, das beschreibt welche Puffer etc vorhanden sein sollen und wie groß diese sein sollen. Z.B. wird dort meistens für den Tiefenpuffer 24 Bit angegeben. Dort muss auch dem Stencilpuffer eine Größe gegeben werden, damit man überhaupt damit arbeiten kann.

Für das Setzen des Pixelformats werden in der Win32 API Funktionen wie (wgl)ChoosePixelFormat benutzt.
In SDL funktioniert das über die OGL-Properties.
Wenn du den DGL-Header verwendest wird das wahrscheinlich von diesem übernommen (kenne den nicht, da ich kein Delphi mache). Schau dir dazu mal Lektion 1 an: http://wiki.delphigl.com/index.php/Tuto ... alisierung

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 16:15 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
jo habe nu die stenciltiefe auf 8 bits gesetzt, weil ich das mal irgendwo gelesen habe.
hier ist nun das resultat:
Bild

Nun nimmt er also ein rechteck um die fonts. Das liegt wohl daran, dass die Fonts als Texturen gezeichnet werden. Kann man da irgendwas machen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 18:17 
Offline
DGL Member
Benutzeravatar

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

dazu müsste man wissen wie du deine Schrift zeichnest.
Ich schätze mal du blendest die einfach nur, ohne Alphatest.
Wenn du einen Alphatest mit drin hast, werden entsprechende Fragmente deiner Charakterrechtecke verworfen und kommen auch nicht in den Stenciltest mit rein.
Wenn du allerdings nur blendest, dann werden sie trotzdem gezeichnet, vermischen sich aber nur so mit dem Hintergrund, dass keine Änderung zu sehen ist.
Wenn du nicht einmal blendest, sondern nur mit einem schwarzen Hintergrund zeichnest solltest du deine Methode definitiv überdenken ;)

Irgendwo im Wiki müsste es einen Artikel über Textausgabe geben, schau dich da mal um...

aber immerhin funktionierts schonmal ;)

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 18:25 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
jo dass der stencil geht, freut mich echt.
zum thema:
ich blende ja,
ich mache aber auch alphatests

Ich teste erst den Alphawert der Font, erst dann kommt der Stenciltest, denn die Wiki sagt !Erst Alpha dann Stencil!
Code:
  1.  
  2.     OrthoStart;
  3.       glEnable(GL_ALPHA_TEST);
  4.       glAlphaFunc(GL_GREATER, 0.1);
  5.       glStencilFunc(GL_ALWAYS, 1, 1);
  6.       glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  7.  
  8.       glEnable(GL_TEXTURE_2D);
  9.       FontManager.Draw('Particle','TEST',200,100);
  10.     OrthoStop;


Allerdings kommt es immernoch im Rechteck. Selbst bei GL_NEVER im alphatest, der ja eigentlich NICHTS durchlassen dürfte, kommt immernoch das gesamte rechteck durch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 19:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Umpf ...
ok, jetzt wird deine Methode zum zeichnen des Textes wirklich interessant :)
kannst die mal posten?

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 04, 2006 19:49 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
*g* is eigentlich nix besonderes:
Code:
  1.  try
  2.     Fonts[FontNames.IndexOf(FontName)].Draw(Text,X,Y);
  3.   except
  4.     BugTracker.AddBugReport('> TFontManager.Draw: Failed to load ' + FontName);
  5.   end;


Zum Alphatest gibs keinen buffer oder? der wirkt sich ja direkt auf den colobuffer aus oder? nich dass ich wieder was vergessen habe zu aktivieren


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 05, 2006 08:24 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
:lol: Und was steht in dem Draw drinnen. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 05, 2006 15:16 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ahso na der ruft nur den DrawBefehl von EasySdlFonts auf.
Ist an sich nur ne Weiterleitung, die aber ermöglicht, den Namen des Fonts zu nehmen und einen Eintrag im BugTracker macht, falls es nen Fail gibt

Also er ruft in der EasySDLFonts die TFont.Draw auf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 08, 2006 18:13 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hat wer ne Idee?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]