JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2f9a7b7e0f5c8120ab9962749ead113eMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Bild in C++ manipulieren?
Gehe zu Seite Zurück  1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 07.09.2003, 23:48    Titel: Antworten mit Zitat

kannst du dir das jetzt wirklich nciht denken?

Les dir diesen Thread mal durch, wenn du es danach nicht weißt, wie man es machen soll, dann glaub ich kann dir keiner mehr helfen...

http://www.jliforum.de/board/viewtopic.php?t=1116&highlight=alpha
_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
philipp_boeing
JLI'ler


Alter: 35
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 08.09.2003, 08:39    Titel: Antworten mit Zitat

das wollte ich mir schonmal holen, nur der Link ist tot
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.09.2003, 11:22    Titel: Antworten mit Zitat

Code:

void SetAlpha(LPDIRECT3DTEXTURE9 lpTexture, char Alpha)
{
D3DLOCKED_RECT LockRect;

lpTexture->LockRect(0,&LockRect,0,D3DLOCK_DISCARD)

DWORD* p = (DWORD*)LockRect.pBits;

for(int i=0;i<TextureHeight;i++)
{
    for(int j=0;j<TextureWidth;j++)
   {
       DWORD CurColor = *p;
       CurColor &= 0x00FFFFFF;
       CurColor += ((int)Alpha) << 24;
       p++;
   }
   p+= LockRect.lPitch;
}

m_lpTexture->UnlockRect(0);
}



Ich habe es nicht getestet, aber so (ähnlich) sollte es funktionieren.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
philipp_boeing
JLI'ler


Alter: 35
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 08.09.2003, 21:09    Titel: Antworten mit Zitat

hi,

ich habe jetzt mit Hazel und AFE-GmdG etwas gesprochen und bin bis jetzt so weit:

Code:

void CSprite::SetAlpha(int Alpha)
{
      D3DLOCKED_RECT LockedRect;
      m_AnimationVec[0]->LockRect(0,&LockedRect,0,D3DLOCK_DISCARD);

       DWORD* p = (DWORD*)LockedRect.pBits;

       for(int i = 0; i < m_Width * m_Height; i++)
      {
            DWORD CurColor = *p;
            CurColor &= 0x00FFFFFF;
            CurColor += (Alpha) << 24;
            p++;          
      }

      m_AnimationVec[0]->UnlockRect(0); 
}


so sieht die funktion bis jetzt aus. Leider stürzt das Programm ab dieser Funktion ab. Also ließ ich den Debugger durchlaufen. Mit folgendem ergebnis: Das Programm stürzt ab
Code:

CurColor &= 0x00FFFFFF;

dieser Zeile ab und in der Zeile
Code:

DWORD* p = (DWORD*)LockedRect.pBits;

ersteht folgender Fehler: "Ausdruck kann nicht ausgewertet werden"
Jetzt weiß ich leider nicht weiter. Ich hoffe ihr könnt mir (noch mal) helfen

MfG

Philipp Böing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 08.09.2003, 21:14    Titel: Antworten mit Zitat

@Christian: Du schreibst doch CurColor garnicht mehr in die Textur zurück oder überseh ich was?
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 08.09.2003, 22:03    Titel: Antworten mit Zitat

Hazel hat Folgendes geschrieben:
@Christian: Du schreibst doch CurColor garnicht mehr in die Textur zurück oder überseh ich was?


Stimmt, das habe ich übersehen..wie gesagt, ich habe es nicht getestet...es muss also noch ein

*p = CurColor; angefügt werden (vor dem p++).
Außerdem sind in der Fkt. noch ein paar weitere Fehler.

1. LockRect.lPitch wird in Bytes angegeben, deshalb sollte es am Anfang der Funktion durch 4 geteilt werden:

lpTexture->LockRect(0,&LockRect,0,D3DLOCK_DISCARD)

DWORD* p = (DWORD*)LockRect.pBits;
LockRect.lPitch /= 4;

2. Am Ende darf nur der Pitch - der Texturbreite hinzuaddiert werden:

p += LockRect.lPitch - TextureWidth;

Die Methode sollte also so aussehen:

Code:

void CSprite::SetAlpha(BYTE Alpha)
{
   D3DLOCKED_RECT LockRect;

   m_AnimationVec[m_CurrentImage]->LockRect(0,&LockRect,0,0);

   DWORD* p = (DWORD*)LockRect.pBits;

   LockRect.Pitch /= 4;

   for(int i=0;i<m_Height;i++)
   {
      for(int j=0;j<m_Width;j++)
      {
         DWORD CurColor = *p;
         
         if(CurColor & 0xFF000000)
         {
            CurColor &= 0x00FFFFFF;
            CurColor += ((int)Alpha) << 24;
            *p = CurColor;
         }
         p++;
      }
      p += LockRect.Pitch - m_Width;
   }

   m_AnimationVec[m_CurrentImage]->UnlockRect(0);
}


Ich habe es gerade probiert, bei mir geht es. Geht es jetzt bei dir auch? Ich rufe SetAlpha mit 50 auf.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
philipp_boeing
JLI'ler


Alter: 35
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 08.09.2003, 22:08    Titel: Antworten mit Zitat

JUHU!!!! Very Happy Smile Very Happy Smile Very Happy

Ich verbeuge mich vor dir!

Es geht...

Danke, danke, danke

Philipp Böing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
philipp_boeing
JLI'ler


Alter: 35
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 10:43    Titel: Antworten mit Zitat

ein Problem hat die funkíon noch:

wenn das Bild bereits einen alpha wert hat (.png) was dann? der wird einfach ignoriert. Wie bekommt man das weg?

MfG

Philipp Böing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 10:53    Titel: Antworten mit Zitat

Bei mir klappt das nicht im geringsten, wenn ich das für meinen Backbuffer mache, nachdem er die Surface geblittet hat, die ich halb transparent will.

Code:

BYTE Alpha = 50;
   int m_Width=SCREEN_WIDTH;
   int m_Height=SCREEN_HEIGHT;

//   D3DCOLOR* lpSurface;      // Speicheradresse der Surface
   D3DLOCKED_RECT Surfdesc;// Surfacedesl Struktur


   DD_2D_Graphics.GetBuffer()->LockRect(&Surfdesc,NULL,NULL);

   D3DCOLOR* p = (DWORD*)Surfdesc.pBits;

   Surfdesc.Pitch *= 0.25;

   for(int i=0;i<m_Height;i++)
   {
      for(int j=0;j<m_Width;j++)
      {
         DWORD CurColor = *p;
         
         if(CurColor & 0xFF000000)
         {
            CurColor &= 0x00FFFFFF;
            CurColor += ((int)Alpha) << 24;
            *p = CurColor;
         }
         p++;
      }
      p += Surfdesc.Pitch - m_Width;
   }

   DD_2D_Graphics.GetBuffer()->UnlockRect();

_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 11:00    Titel: Antworten mit Zitat

Welches Bild hat einen Alphawert? Was willst du machen?
@TheMillenium: Was du machen willst verstehe ich auch nicht. Bei dem Code, den du gepostet hat sieht es so aus, als würdest du den Alphawert des Backbuffers ändern - was soll das?

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
philipp_boeing
JLI'ler


Alter: 35
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 11:07    Titel: Antworten mit Zitat

ich möchte mit dieser funktion (Set Alpha) zum beispiel eine schleife schreiben in der dieses bild langsam eingeblendet wird, nur dann funktioniert es irgendwie nicht. Der Alpha Wert der Textur wird ignoriert.

MfG

Philipp Böing Crying or Very sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 11:12    Titel: Antworten mit Zitat

Ich habe gedacht, damit kann man den gleichen Effekt erzielen, den man mit Grafikprogrammen machen kann oder wenn du Macromedia Flash kennst. Da kann man einfach ein Bild nehmen und das Bild halbtransparent machen.

_________________
The source of all power is in its destiny...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 11:17    Titel: Antworten mit Zitat

@philipp: Das sollte gehen. Die Funktion funktioniert bei dir doch, oder?

@TheMillenium: Das Problem ist aber, das der Backbuffer der Hintergrund ist, da liegt nichts mehr hinter (keine Farbe oder so) Du musst schon was in den Hintergrund schreiben/blitten und dann was drüberlegen, was transparent werden soll.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
philipp_boeing
JLI'ler


Alter: 35
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 11:30    Titel: Antworten mit Zitat

So sieht meine Funktion bis jetzt aus:

Code:

void CSprite::SetAlpha(BYTE Alpha)
{
   D3DLOCKED_RECT LockRect;

   m_AnimationVec[m_CurrentImage]->LockRect(0,&LockRect,0,0);

   DWORD* p = (DWORD*)LockRect.pBits;

   LockRect.Pitch /= 4;

   for(int i=0;i<m_Height;i++)
   {
      for(int j=0;j<m_Width;j++)
      {
         DWORD CurColor = *p;
         CurColor &= 0x00FFFFFF;
         CurColor += ((int)Alpha) << 24;
         *p = CurColor;
       p++;
     }
      p += LockRect.Pitch - m_Width;
   }

   m_AnimationVec[m_CurrentImage]->UnlockRect(0);
}


und sie funktioniert ja auch, nur das der Alpha Wert, der vorher schon in der Textur (.png) war als weiß dargestellt wird... und .... naja eigentlich sollte der transparent bleiben
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 09.09.2003, 12:35    Titel: Antworten mit Zitat

Dann muss du mal an der Stelle:

DWORD CurColor = *p;

mti dem Debugger schauen, was in CurColor oder *p drinsteht und das Programm anpassen.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2, 3  Weiter
Seite 2 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum