Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 07.09.2003, 23:48 Titel: |
|
|
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 |
|
 |
philipp_boeing JLI'ler

Alter: 35 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 08.09.2003, 08:39 Titel: |
|
|
das wollte ich mir schonmal holen, nur der Link ist tot |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 08.09.2003, 11:22 Titel: |
|
|
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 |
|
 |
philipp_boeing JLI'ler

Alter: 35 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 08.09.2003, 21:09 Titel: |
|
|
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 |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 08.09.2003, 21:14 Titel: |
|
|
@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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 08.09.2003, 22:03 Titel: |
|
|
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 |
|
 |
philipp_boeing JLI'ler

Alter: 35 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 08.09.2003, 22:08 Titel: |
|
|
JUHU!!!!
Ich verbeuge mich vor dir!
Es geht...
Danke, danke, danke
Philipp Böing |
|
Nach oben |
|
 |
philipp_boeing JLI'ler

Alter: 35 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 09.09.2003, 10:43 Titel: |
|
|
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 |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 09.09.2003, 10:53 Titel: |
|
|
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 09.09.2003, 11:00 Titel: |
|
|
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 |
|
 |
philipp_boeing JLI'ler

Alter: 35 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 09.09.2003, 11:07 Titel: |
|
|
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  |
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 09.09.2003, 11:12 Titel: |
|
|
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 09.09.2003, 11:17 Titel: |
|
|
@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 |
|
 |
philipp_boeing JLI'ler

Alter: 35 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 09.09.2003, 11:30 Titel: |
|
|
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 |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 09.09.2003, 12:35 Titel: |
|
|
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 |
|
 |
|