PCX und transparent - opengl



  • Ich hab ein ganz einfaches Problem: Ich habe ein PCX Bild was mit OpenGL ausgegeben wird. Wie genau das geht, weiß ich auch nicht, hab's vom nem Tutorial. Aber ich will eine Farbe transparent machen. Die Suche vom Forum und Google hab ich schon benutzt und weiß nun das ich irgentwas mit Alpha machen muss. Nen Code beispiel hab ich aber nur für BMP gefunden. Kann mir jemand erklären wie sowas funktioniert und am besten noch den Code dazu 😃

    So wird das PCX gezeichnet:

    glColor3f(1.0f, 1.0f, 1.0f);
    
       glBindTexture(GL_TEXTURE_2D, Image.ID);
    
       glBegin(GL_QUADS);
          glTexCoord2f(0.0, 1.0); glVertex3f(-1.5f, -1.5f, -2.0f);
          glTexCoord2f(1.0, 1.0); glVertex3f(1.5f, -1.5f, -2.0f);
          glTexCoord2f(1.0, 0.0); glVertex3f(1.5f, 1.5f, -2.0f);
          glTexCoord2f(0.0, 0.0); glVertex3f(-1.5f, 1.5f, -2.0f);
       glEnd();
    

    mfg.



  • Entweder du fügst bei laden des Bildes einen Alpha Channel hinzu oder du benutzt Masking.



  • ProgChild schrieb:

    Entweder du fügst bei laden des Bildes einen Alpha Channel hinzu oder du benutzt Masking.

    Ich glaub ich nimm diesen Alpha Channel. Aber wie kann ich den hinzufügen, hab ich bis jetzt nur für bmp dateien gesehen?

    mfg.



  • joomoo schrieb:

    Ich glaub ich nimm diesen Alpha Channel. Aber wie kann ich den hinzufügen, hab ich bis jetzt nur für bmp dateien gesehen?

    mfg.

    Du kannst das genau so machen, wie bei BMPs. Ein Bild als Textur und ein Bild als Alpha Channel laden und beides zusammen in die Textur tun. Dann musst du beim Rendern nur sicher stellen, dass du Alpha Transparenz angeknipst hast.

    Wenn PCX einen eigenen Alpha Channel hat, dann kannst du auch den nehmen.



  • ProgChild schrieb:

    joomoo schrieb:

    Ich glaub ich nimm diesen Alpha Channel. Aber wie kann ich den hinzufügen, hab ich bis jetzt nur für bmp dateien gesehen?

    mfg.

    Du kannst das genau so machen, wie bei BMPs. Ein Bild als Textur und ein Bild als Alpha Channel laden und beides zusammen in die Textur tun. Dann musst du beim Rendern nur sicher stellen, dass du Alpha Transparenz angeknipst hast.

    Wenn PCX einen eigenen Alpha Channel hat, dann kannst du auch den nehmen.

    Hat PCX nen eigenen Alpha Channel? Ich glaub nicht oder?

    Aber ich hab mir das eigentlich anders vorgestellt, nähmlich dass eine Farbe, z. b. grün komplett ausgeblendet wird. Wie bei gifs. Das mit dem zweiten Bild als Alpha Channel hab ich nicht verstanden. Das wäre dann doch das gleiche wie ne Maske???

    mfg.



  • So ähnlich, nur dass du wählen kannst, wie stark ein Bild an einer Stelle Transparent ist. Ob es 50%, 100%, 25%, transparent oder komplett sichtbar ist. Bei einer Maske gibt es nur, da oder nicht da.
    Andere Verfahren kenne ich nicht.



  • ProgChild schrieb:

    So ähnlich, nur dass du wählen kannst, wie stark ein Bild an einer Stelle Transparent ist. Ob es 50%, 100%, 25%, transparent oder komplett sichtbar ist. Bei einer Maske gibt es nur, da oder nicht da.
    Andere Verfahren kenne ich nicht.

    Aso, aber sowas mit % bräuchte ich nicht, und so ne maske, wär eigentlich ungeeignet, weil ich die ja dann zu jedem bild erstellen muss 😞
    Aber ich glaub ich komm nicht drumm herum. Kennt jemand noch nen Tutorial dazu auf Deutsch?

    mfg.



  • http://www.codeworx.org/opengl_tut20.php

    Das is ne' deutsche Übersetzung von dem Tutorial. Ich selbst habs mir nicht angeguckt, aber es gibst auch möglichkeinten eine Maske automatisch zu erzeugen. Vielleicht findeste irgendwo dafür ein Beispiel. Ich hab jedenfall schon ein paar gesehen.



  • Hi,
    also du könntest beispielsweise nen PNG oder GIF89a laden. Diese haben Transparenz. Sollte dann auch gehn..



  • ich mach es so.
    normales image laden und dann die pixel bearbeiten.

    methode meiner image klasse, denke sollte ziemlich klar sein.
    nur zu beachten ist das das member m_nBpp = farbtiefe >> 3 ist um einfacher die pixeldaten zu manipulieren und um einfacher mit opengl zu kommunizieren.

    // Beschreibung: Pixeldaten mit Colorkey bearbeiten
    			// Rückgabewert: 
    			// Parameter: Farbe
    			void SetColorKey(const Color4c &cKey)
    			{
    				const size_t		nSize = m_nWidth * m_nHeight * m_nBpp;
    				const unsigned char	cRed = cKey[0];
    				const unsigned char	cGreen = cKey[1];
    				const unsigned char	cBlue = cKey[2];
    
    				if(m_nBpp == 4)		// image hat schon einen alpha kanal
    				{
    					for(size_t i = 0; i < nSize; i += 4)
    					{
    						if(
    							m_pData[i + 0] == cRed &&
    							m_pData[i + 1] == cGreen &&
    							m_pData[i + 2] == cBlue)
    						{
    							m_pData[i + 3] = 0;
    						}
    						else
    							m_pData[i + 3] = 255;
    					}
    				}
    				else if(m_nBpp == 3)
    				{
    					unsigned char *pNewData = new unsigned char[m_nWidth * m_nHeight * 4];
    
    					size_t i, j;
    
    					for(i = 0, j = 0; j < nSize; i += 3, j += 4)
    					{
    						if(
    							m_pData[i + 0] == cRed &&
    							m_pData[i + 1] == cGreen &&
    							m_pData[i + 2] == cBlue)
    						{
    							pNewData[j + 3] = 0;
    						}
    						else
    							pNewData[j + 3] = 255;
    
    						pNewData[j + 0] = m_pData[i + 0];
    						pNewData[j + 1] = m_pData[i + 1];
    						pNewData[j + 2] = m_pData[i + 2];
    					}
    
    					delete [] m_pData;
    
    					m_pData = new unsigned char[m_nWidth * m_nHeight * 4];
    
    					std::memcpy(
    						m_pData,
    						pNewData,
    						sizeof(unsigned char) * m_nWidth * m_nHeight);
    
    					m_nBpp = 4;
    
    					delete [] pNewData;
    				}
    			}
    

    und beim binden der textur

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    

    mit angeben

    von gif's etc. würde ich abraten da meistens die komprimierung das bild ungenau macht. tga haben afaik noch nen alpha.



  • DocJunioR schrieb:

    Hi,
    also du könntest beispielsweise nen PNG oder GIF89a laden. Diese haben Transparenz. Sollte dann auch gehn..

    Cool, das mit den pngs gefällt mir. Aber wie lade ich die? Funktioniert das genauso wie bmps, pcxs oder tgas???



  • Naja - nimm libpng, oder OpenIL aka Devil.


Anmelden zum Antworten