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:
OrthoStart;
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
glEnable(GL_TEXTURE_2D);
FontManager.Draw('Particle','TEST',200,100);
OrthoStop;
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:
// Blending aktivieren
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glStencilFunc(GL_EQUAL,1,1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
Effekte[0].Advance(DrawTime);
glLoadIdentity;
glTranslatef(0,-1,-3);
Effekte[0].Render;
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...
Habe mir jetz nochma Jans BSP ganz genau angesehen. Hoffe, ich habe es diesmal richtig verstanden, geht aber immernoch nich.
Code:
glEnable(GL_STENCIL_TEST);
OrthoStart;
glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);
glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
glEnable(GL_TEXTURE_2D);
FontManager.Draw('Particle','TEST',200,100);
OrthoStop;
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:
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);// Clear The Screen And The Depth Buffer
glStencilFunc(GL_EQUAL,1,1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
Effekte[0].Advance(DrawTime);
glLoadIdentity;
glTranslatef(0,-1,-3);
Effekte[0].Render;
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:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);// Clear The Screen And The Depth Buffer
glStencilFunc(GL_NEVER,1,1);
glStencilOp(GL_ZERO, GL_KEEP, GL_KEEP);
Effekte[0].Advance(DrawTime);
glLoadIdentity;
glTranslatef(0,-1,-3);
Effekte[0].Render;
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...
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)
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...
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)
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)
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:
OrthoStart;
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.1);
glStencilFunc(GL_ALWAYS,1,1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
glEnable(GL_TEXTURE_2D);
FontManager.Draw('Particle','TEST',200,100);
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.
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)
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
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.