OpenGL blendfunc
Übersicht

PhillipKBetreff: OpenGL blendfunc |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heyho Community =)
Ich versuche mich jetzt seit stunden an einer art Masking in OGL, um texturen ineinander überlaufen zu lassen. Mittlerweile habe ich so ziemlich jede internetseite durchgearbeitet, die im entferntesten was mit dem thema zu tun hat, ich bin trotzdem nicht weiter. Folgendes problem: Ich habe 3 Texturen, die ich übereinander zeichnen möchte. 1) Textur 1. 2) Schwarz/Weiß maske. 3) Texutr 2, die nur in Schwarze oder weiße pixel schreiben soll. So wie ich das sehe, ist das nicht möglich ![]() Ich habe schon etliche kombinationen ausprobiert, selbst ein kleinen code snippet, der alle möglichen variationen durchspielt. So wie in den ganzen tutorials kriege ich es einfach nicht hin ![]() Um es nochmal zu verdeutlichen: Ich habe eine grundtextur und eine Schwarz/Weiße maske, wovon ich gerne die Schwarzen oder weißen anteile als "alpha" für textur nummer 2 nutzen würde. Schwarz -> Textur1 soll durchscheinen, weiß -> Textur 2 soll sichtbar sein. In einem C++ tutorial, so wie in jedem anderen tutorial (nehe und co) wirds immer folgendermaßen gemacht: Blending aktivieren Tiefentest ausschalten glBlendFunc( GL_DST_COLOR, GL_ZERO ) Maske zeichnen. glBlendFunc( GL_ONE, GL_ONE ) Overlay zeichnen. Das ganze soll geschehen, nachdem man alles solide auf den screen gezeichnet hat (landschaft und co). Das einzige was ich damit hinkriege, ist eine der beiden Texturen voll anzuzeigen und an den anderen stellen, wo die jeweils andere sein soll, ein additives blending zu erzeugen. Einen shader möchte ich ungerne nutzen, ebenso die texturen "vorzuberechnen" - das würde zuviel speicher verbrauchen. Hat jemand schonmal das selbe versucht und kann mir eventuell ein paar nützliche tipps geben? ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was spricht gegen Shader?
Ob du nun eigene erstellst oder die Standardshader im Hintergrund ablaufen lässt, sollte von der Geschwindigkeit gesehen (fast) egal sein. Abgesehen davon sollte es so funktionieren: Zuerst zeichnest du dein 1. Bild so, dass alles überschrieben wird. (GL_ONE, GL_ZERO) Nun sind die Pixelwerte (R1,G1,B1,1.0). (Wichtig ist, dass der Alphawert 1 ist!) Danach wird das zweite Bild so gezeichnet, dass das erste Bild mit dem durch die Farbe entstehenden Alpha-Faktor multipliziert wird. (GL_ZERO, GL_ONE_MINUS_SRC_COLOR) Im Farbwert steckt nun auch der Faktor für das erste Bild. (R1*(1-A),G1*(1-A),B1*(1-A),(1-A)) A=1-(1-A) wird nun als Faktor für das andere Bild verwendet. (GL_ONE_DST_ALPHA, GL_ONE) Das Ergebnis ist nun die fertige Mischung zwischen den beiden Bildern. (R1*(A-1)+R2*A,G1*(A-1)+G2*A,B1*(A-1)+B2*A,1.0) Ich hoffe, dass das hilft. ![]() mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein, klappt alles irgendwie nicht ![]() Es ist zum mäuse melken :3 Um das problem zu isolieren, habe ich das ganze mal in eine eigenständige bmx gepackt: BlitzMax: [AUSKLAPPEN] SuperStrict Die bilder Rot, Orange und Maske sind nur simple testbilder. Rot ist einfach nur rot (255,0,0), orange ist 255,128 odersowas, mit ganz oft "Test" draufgeschrieben (schwarz) Maske ist der Cloud filter aus Gimp mit schwellwerten-spielereien und weichzeichnung. Im endeffekt also ein wirrwarr aus weißen linien, die nur minimal weichgezeichnet sind. Mit diesen einstellungen klappt es. Undzwar als einziges :/ In meinem Projekt gibts immer irgendein problem. Entweder ist Textur 1 oder Textur 2 sichtbar, nie beide zusammen. Dort wo die jeweils andere sein müsste, ist es immer schwarz. Oder aber, eine textur scheint an der passenden stelle durch, an der anderen werden sie additiv geblendet. Ein paar fakten habe ich noch: Code: [AUSKLAPPEN] glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
muss ich nutzen, weil ich isometrische kacheln zeichne. Das ganze alelrdings als simples 2d Sprite, dh die ecken sind jeweils "durchsichtig" -> Transparent. Die isometrischen kacheln überlappen an eben diesen ecken, dh die fummeln sich gegenseitig ins bild. Nun, der einzige unterschied den ich momentan sehe, sind eben diese alphapixel die eventuell auf den framebuffer geschrieben werden. Wahrscheinlich läuft es doch auf shader hinaus. Allerdings muss ich mich dafür erstmal mit multitexturkoordinaten auseinander setzen, da ich zumindest 2 setzen muss (und das ganze 2x mit 2 shadern zeichnen muss), oder aber 3 unterschiedliche uv paare setzen muss, mit 3 unterschiedlichen uv sets :3 |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum zeichnest du die Bilder nicht übereinander?
So habe ich das richtige Ergebnis: BlitzMax: [AUSKLAPPEN] glBindTexture(GL_TEXTURE_2D, orange) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ich sie nicht übereinander gezeichnet habe, liegt am "debuggen".
Ich wollte mir angucken, wie die verschiedenen Blendmodi mit dem hintergrund "agieren", um eventuelle fehler im Hauptprojekt ableiten zu können. Wurde aber bis jetzt noch nichts :/ Das richtige ergebnis produziert es, ja ![]() Naja morgen ist auchnoch ein tag ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group