Alphakanäle von Texturen dynamisch verändern in OpenGL



  • Hi, ich habe da eine Frage generell zu Alphablending bzw.
    Transparenz-Effekten. Ich möchte mir eine kleine 2D-Engine
    basierend auf OpenGL aufbauen, um die Vorteile der 3D-Beschleunigung
    nutzen zu können. Dafür benutze ich Ortho2D und Textuierte Quads.
    Nun fehlte mir noch die Möglichkeit, meine Sprites transparent
    darstellen zu können. Hierfür lade ich BMP's und füge ihnen
    für eine bestimmte RGB-Farbe den Alphawert 0 hinzu.

    int 2DEngine::LoadTexture2(char *file, int containerPos, unsigned char red, unsigned char green, unsigned char blue)
    {
    	if (numberOfTextures > 0)
    		if (containerPos >=0 && containerPos < numberOfTextures)
    		{
    			AUX_RGBImageRec * textureImage = LoadBitmap(file);
    
    			unsigned char *dest=new unsigned char[textureImage->sizeX*textureImage->sizeY*4];
    
    			for(int i=0,j=0;i<(textureImage->sizeX*textureImage->sizeY*3);i+=3,j+=4)
    			{
    				if(	textureImage->data[i]	== red &&
    					textureImage->data[i+1]	== green &&
    					textureImage->data[i+2]	== blue)
    				{
    					dest[j+3]=0;
    				}
    				else
    					dest[j+3]=255;
    
    				dest[j]  = textureImage->data[i];
    				dest[j+1]= textureImage->data[i+1];
    				dest[j+2]= textureImage->data[i+2];
    			}
    
    			if (textureImage)
    			{
    				glBindTexture(GL_TEXTURE_2D, textureContainer[containerPos]);	
    				glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    				glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    				glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    				glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    				glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    				glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
    				glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, textureImage->sizeX, textureImage->sizeY, 
    													0, GL_RGBA, GL_UNSIGNED_BYTE, dest);
    
    				delete textureImage;
    
    				return 1;
    			}
    
    		}			
    
    	return 0;	
    }
    

    Später kann ich dann ein transparentes Sprite mit

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    	glBegin(GL_QUADS);
    		glTexCoord2f(0.0f, 1.0f); 	
    		glVertex3f(100.0f, 100.0f, 0.0f);
    		glTexCoord2f(1.0f, 1.0f); 
    		glVertex3f(164.0f, 100.0f, 0.0f);
    		glTexCoord2f(1.0f, 0.0f); 
    		glVertex3f(164.0f, 164.0f, 0.0f);
    		glTexCoord2f(0.0f, 0.0f); 
    		glVertex3f(100.0f, 164.0f, 0.0f);
    
    	glEnd();
    glDisable(GL_BLEND);
    

    ..das ganze funktioniert auch wunderbar, nur ist nun meine Frage, wie kann ich
    nachträglich bestimmte Alphawerte oder Farbwerte der Texture des Sprites verändern. Beispielsweise soll das transparente Sprite langsam opak werden. Ist hier eine dynamische Veränderung der Alphakanäle oder Farbwerte meiner geladenen Texture auf einfachem Wege möglich ?

    Gruß

    Final 🙂


  • Mod

    indem du mit glcolor4f fuer jeden vertex noch einen alphawert angibst, der sollte dann mit der textur verrechnet werden (standard einstellung in ogl) und so kannst du den alphawert sehr einfach pro vertex modifizieren.



  • Wenn sich die Transparenz des gesamten Sprite ändern soll, kannst du einfach mit Blending in OpenGL arbeiten



  • hmmm..verstehe das noch net ganz 😞 glColor4 gibt doch eine Farbe + Alphawert an, welcher für alle darauf folgenden Texturen verwendet wird ? Welche Farbe gebe ich da an ? Ich will ja nur beispielsweise die gesamte Durchlässigkeit verändern und nicht eine Farbe definieren. Habe es jedenfalls ausprobiert und glColor4 gibt keine Ergebnisse, egal ob vor GL_Begin oder bei jedem einelnen vertex 😞


  • Mod

    FinalbrainXP schrieb:

    hmmm..verstehe das noch net ganz 😞 glColor4 gibt doch eine Farbe + Alphawert an, welcher für alle darauf folgenden Texturen verwendet wird ? Welche Farbe gebe ich da an ? Ich will ja nur beispielsweise die gesamte Durchlässigkeit verändern und nicht eine Farbe definieren. Habe es jedenfalls ausprobiert und glColor4 gibt keine Ergebnisse, egal ob vor GL_Begin oder bei jedem einelnen vertex 😞

    vermutlich hast du im falschen wertebereich gearbeitet. aber bevor ich dir hier alles hischreibe was eh ueberall schon stehen sollte, informier dich 😉



  • oki..ich werde nochmal dann ein bisschen suchen.

    Aber wo ich dich grad erwische, vielleicht kannst du mir noch ein paar Grundlegende einfache Fragen zu openGL beantworten, bevor ich da lange suche ?
    (Komme von der DirectDraw schiene)

    1.) Wenn ich ein Bitmap 1:1 in 2D zeichnen möchte (Ortho und Quad-Texture), dann muss ich ja genau die exakten Dimensionen angeben.

    Beispiel: 32x32 Texture: (size=32)

    glTexCoord2f(0.0f, 1.0f);
    glVertex3f(posX, posY, 0.0f);
    glTexCoord2f(1.0f, 1.0f);
    glVertex3f(posX+size, posY, 0.0f);
    glTexCoord2f(1.0f, 0.0f);
    glVertex3f(posX+size, posY-size, 0.0f);
    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(posX, posY-size, 0.0f);

    So wie ich es angegeben habe, funktioniert es wunderbar, wenn ich die Dimensionen kleiner oder größer mache, stimmt es nicht mehr mit dem original überein. Das hieße aber, dass OpenGL den letzen Pixel nicht als "inclusive" ansieht, weil posx+size ja 33 Pixel in diesem Fall ergeben ?

    2.) Im Ortho2D-Modus ist nur das Rotieren über die Z-Achse möglich ?
    Rotationen um andere Achsen sind bei mir garnicht erst sichtbar.

    Gruss und vielen Dank

    Final


  • Mod

    FinalbrainXP schrieb:

    Das hieße aber, dass OpenGL den letzen Pixel nicht als "inclusive" ansieht, weil posx+size ja 33 Pixel in diesem Fall ergeben ?

    ja, so ist das leider. du kannst aber in vielen treibern ein alternatives texelcenter forcieren (da wo du qualitaet, aufloesung usw. einstellst)

    2.) Im Ortho2D-Modus ist nur das Rotieren über die Z-Achse möglich ?
    Rotationen um andere Achsen sind bei mir garnicht erst sichtbar.

    ich weiss jetzt nicht ob du vom frustum/view oder von den sprites sprichst, an sich ist aber beides moeglich, jedoch erkennt man dann natuerlich dass es nur 2d objekte sind die du rotierst.


Anmelden zum Antworten