openGL->texturen einblenden

TeCe

Erfahrenes Mitglied
Hallö, habe inzwischen auch mal wieder ein kleines Problemchen.
Ich bastel grad an einer mehr oder minder 2D-Demo. Hab mir über Tage alles mögliche zusammengesucht um meine gewünschten Effektchen zusammenzusuchen, klappt alles auch schon recht gut. Nur dieses eine kleine Problemchen will ich nicht einfach übersprigen:

Ich habe eine statische Textur, die immer angezeigt wird, jedoch will ich das diese zu Beginn eingeblendet wird. Habe mir schon ein kleines Fader-Objekt geschrieben, dass die ganze Szene einblenden soll, jedoch besteht das selbe Problem - es ist nicht zu sehen. Vermutlich liegt es an den glBlendFunc-Parametern, mit denen ich teilweise noch etwas überfordert bin.

Mein letzter Versuch bestand darin, eine Alphatextur unter die Eigentliche zu legen, sodass ich nur die Alphatextur einblenden muss.
Hier einmal ein Snippet, von der Hauptszene, in der die Textur eingeblendet werden soll:

Code:
		if(blend>0) blend-=0.00002f;
		glBlendFunc(GL_SRC_COLOR, GL_ONE);
		glBindTexture(GL_TEXTURE_2D, tex->tex("watchalpha"));
		glColor4f(1,1,1,1);
		glBegin(GL_QUADS);
			glTexCoord2f(0, 0);	glVertex3f(-1.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 0);	glVertex3f(0.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 1);	glVertex3f(0.1f,	1.1f,	-1.0f);
			glTexCoord2f(0, 1);	glVertex3f(-1.1f,	1.1f,	-1.0f);
		glEnd();
		glBlendFunc(GL_DST_COLOR,GL_ZERO);
		glBindTexture(GL_TEXTURE_2D, tex->tex("watch"));
		glColor4f(1,1,1,1.0f-blend);
		glBegin(GL_QUADS);
			glTexCoord2f(0, 0);	glVertex3f(-1.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 0);	glVertex3f(0.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 1);	glVertex3f(0.1f,	1.1f,	-1.0f);
			glTexCoord2f(0, 1);	glVertex3f(-1.1f,	1.1f,	-1.0f);
		glEnd();

Egal wie ich die Alphaerte an glColor4f() ändere, es wirkt sich auf keine der Texturen aus. Muss ich vorher noch sowas wie glDepthMask() etc. disablen? Habe wirklich viel rumgespielt und gegoogelt, aber wirklich helfen konnte mir leider keiner der Treffer - eure Chance euch bei mir beliebt zu machen :-)
 
Hi ...

Versuch mal ERST deine Textur zu zeichnen und DANN erst deine ganzen Blending-Effekte etc zu aktivieren ...
So wird die Textur ohne diese Effekte gezeichnet ...

Gruß
Shai
 
das Problem an der Textur ist, dass es sich um ein Bild mit weissem Hintergrund Handelt, dass auf einen animierten Hintergrund gerendert werden soll, ohne das man den weissen Rahmen sieht, deshalb auch die Alphatextur darunter.
Es muss doch irgendeine schicke Kombination von glBlendFunc()s geben, die es zulässt den Alphawert der Textur zu verändern / bzw. einen Grund warum sich momentan die Alphawerte der Texturen nicht verändern lassen!
 
Wie gesagt probier ich hier seit längerem schon dran rum.
Habe es jetzt wenigstens schonmal so weit, dass ich die eigentliche Textur über die Alphatextur einblende, jedoch ist wieder der weisse Rahmen von einer der Texturen zu sehen:

Code:
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_DST_COLOR);//das letzte Problem
		glBindTexture(GL_TEXTURE_2D, tex->tex("watchalpha"));
		glColor4f(1,1,1,1.0f);//soll ja immer voll sichtbar sein, da hier der alphakanal fest angibt, wo geblendet wird
		glBegin(GL_QUADS);
			glTexCoord2f(0, 0);	glVertex3f(-1.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 0);	glVertex3f(0.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 1);	glVertex3f(0.1f,	1.1f,	-1.0f);
			glTexCoord2f(0, 1);	glVertex3f(-1.1f,	1.1f,	-1.0f);
		glEnd();

		glBlendFunc(GL_DST_ALPHA,GL_SRC_ALPHA);
		glBindTexture(GL_TEXTURE_2D, tex->tex("watch"));
		glColor4f(1,1,1,1.0f-blend*0.2f);
		glBegin(GL_QUADS);
			glTexCoord2f(0, 0);	glVertex3f(-1.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 0);	glVertex3f(0.1f,	-1.1f,	-1.0f);
			glTexCoord2f(1, 1);	glVertex3f(0.1f,	1.1f,	-1.0f);
			glTexCoord2f(0, 1);	glVertex3f(-1.1f,	1.1f,	-1.0f);
		glEnd();

Wie sag ich openGL nun, dass er die Transparenzwerte der Alphatextur sowohl auf den Hintergrund anwenden soll und der eigentlichen Textur, dass sie die Transparenzwerte der Alphatextur annimmt? (klingt etwas verwirrend, bin ich ja auch, aber hoffe das ihr versteht wie ich's meine)
 
Ah, hatte dich falsch verstanden ...

Ich würde dir vorschlagen entweder Masken zu benutzen wenn du einen Teil eines Bildes transparent haben möchtest oder sonst schau dir mal die IPicture-Lösung von NeHe an, damit kannst du auch GIFs laden, in denen du die Transparenz bereits in der Datei festlegen kannst ...

Ansonsten sind die NeHe-Tuts auch gut für die ganzen Blending Sachen ...
Die NeHe-Tuts gibts hier auch alle auf Deutsch ...

Gruß
Shai
 
Ja...etwas falsch verstanden...aber ich fürchte auch noch nicht ganz :-|
Mit Alphatextur meinte ich eine Maske(Schwarz was zu sehen sein soll, weiss was transparent ist). Grösstenteils stammt mein Basiswissen auch von NeHe(für diesen Fall Lesson20). Das Bild zu maskieren/blenden(auch ohne Alphatextur) ist kein Problem, Aber beide Texturen transparent zu halten bzw. festzulegen das das Bild über der Maske eingeblendet werden soll - das ist das Problem, da immer eine der beiden den weissen Hintergrund zeigt - vermutlich weil ich falsch blende
 
Ach, ich steh auch bissl aufm Schlauch heut *g*

Ok, ich muss sagen Masken hab ich nie benutzt weil ich mir nie merken konnte wie ich die benutze, außerdem war mir das zu viel Gewurstel mit den verschiedenen Grafiken ...
Daher habe ich auf die IPicture-Lösung zurückgegriffen ... solltest du dir mal anschaun. Wie gesagt kannst du damit GIFs mit Transparenz laden ... hat mir immer geholfen ...

Gruß
Shai
 
Hmmmh...naja...danke für die Mühe!
Aber transparenzen krieg ich ja selbst ohne Maske rein...zumindest sieht es so aus...
Sollte ich es übertreiben und die eine Textur auf die Andere rendern und diese dann rendern? Hört sich eigentlich auch schwachsinnig an...
Och Menno!
Sonst noch Jemand'ne Idee?
 
Hmm, klingt zwar trivial, aber vielleicht hilfts:
Hast du irgendwo in deinem Code (vor du renderst) ein "glEnable(TEXTURE_2D)" stehen?

Daniel
 
:-)
Ja...das wäre zu einfach gewesen!
Vor dem gezeigtem Code wird selbstverständlich ein glEnable(GL_TEXTURE_2D); aufgerufen. Bei Meinem letzten Versuch hat openGL auch fast verstanden, was ich will. Er blendet das eigentliche, beschnittene Bild über die AlphaTextur langsam ein(also über den schwarzen Teil der Alphatextur), nur leider bleibt der weisse Rahmen der AlphaTextur sichtbar. stelle ich den Blendmode-source von GL_ONE auf GL_ZERO seh ich nur die Alphatextur - gleicher Effekt natürlich auch wenn ich die Farben der AlphaTextur einfach invertiere :-|
Also wenn noch Jemand'nen guten Tip hat - immer her damit!
Wenn Jemand ne Seite kennt, wo es eine ordentliche Einführung(am besten mit Beispielbildern) ohne Seitenlange mathematische Formeln die im Hintergrund ablaufen, möge er schnell antworten - werde nämlich wirklich bald bekloppt!
 
Zurück