Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

DirectX per-pixel alpha

[es] :: 3D programiranje :: DirectX per-pixel alpha

[ Pregleda: 3668 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

SashaM
Veliki Bečkerek

Član broj: 28482
Poruke: 213
*.ptt.yu.



+1 Profil

icon DirectX per-pixel alpha10.12.2004. u 01:18 - pre 205 meseci
Vec dva dana bezuspesno pokusavam da napravim per-pixel alpha blend sa DirectX 7 API-em, a nista slicno nisam nasao na netu. Zna li neko resenje, mozda kako se radi masking sa dve slike (jedna je normalna a druga sadrzi alpha vrednost?

Sasa
Life happens but shit goes on
 
Odgovor na temu

Dark Icarus
Goran Lalić
Beograd

Član broj: 19775
Poruke: 428
*.nat-pool.bgd.sbb.co.yu.



+2 Profil

icon Re: DirectX per-pixel alpha10.12.2004. u 17:45 - pre 205 meseci
Prvo, da li radiš u D3D ili u DirectDraw-u?
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan
 
Odgovor na temu

SashaM
Veliki Bečkerek

Član broj: 28482
Poruke: 213
*.ptt.yu.



+1 Profil

icon Re: DirectX per-pixel alpha10.12.2004. u 18:13 - pre 205 meseci
Radim kombinovano. U DDrawu ucitavam surface kao teksturu koju potom lepim na poligon u D3D-u. Uspeo sam da nadjem kod na http://www.gamedev.net/reference/articles/article787.asp koji postavlja alphu na surface, ali samo kao 1 ili 0 (vidljivo ili nevidljivo):

Code:

//surface se prethodno kreira i ucita slika iz .BMP

ZeroMemory( &Desc, sizeof( Desc ));  
Desc.dwSize = sizeof( Desc );  
 
TheSurface->Lock( NULL, &Desc, DDLOCK_WAIT, NULL );  
 
WORD AlphaMask = ( WORD )Desc.ddpfPixelFormat.dwRGBAlphaBitMask;  
WORD RGBMask = ( WORD )( Desc.ddpfPixelFormat.dwRBitMask | 
Desc.ddpfPixelFormat.dwGBitMask | Desc.ddpfPixelFormat.dwBBitMask );  
 
WORD* SurfPtr;  
 
for( DWORD y = 0; y < Desc.dwHeight; y++ )  
{  
    SurfPtr = ( WORD* )(( BYTE* )Desc.lpSurface + y * Desc.lPitch );  
 
    for( DWORD x = 0; x < Desc.dwWidth; x++ )  
    {  
        if(( *SurfPtr & RGBMask ) == 0 )  
            *SurfPtr = 0;  
        else  
            *SurfPtr |= AlphaMask;  
 
        SurfPtr++;  
    }  
}  
 
TheSurface->Unlock( NULL );


Medjutim nikako ne uspevam da ga prepravim da postavlja nijanse vidljivosti (0-255).

Sasa
Life happens but shit goes on
 
Odgovor na temu

Dark Icarus
Goran Lalić
Beograd

Član broj: 19775
Poruke: 428
*.nat-pool.bgd.sbb.co.yu.



+2 Profil

icon Re: DirectX per-pixel alpha10.12.2004. u 23:51 - pre 205 meseci
Mislim da u DDu nema "pravog", alphablendinga, a ovo kako si ti koristio... hm... pričekni da uprčkam kod sebe ovo i prevedem u VB, možda naiđem na nešto...
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan
 
Odgovor na temu

SashaM
Veliki Bečkerek

Član broj: 28482
Poruke: 213
*.ptt.yu.



+1 Profil

icon Re: DirectX per-pixel alpha11.12.2004. u 01:15 - pre 205 meseci
DDraw ne podrzava alpha blending, ali kada preko njega napravis surface sa DDSCAPS_TEXTURE flagom onda ga mozes koristiti kao teksturu u D3D-u. Kada tom surface-u dodas i DDPF_ALPHAPIXELS onda dobijas teksturu sa alpha informacijom... ali ne znam kako da prenesem tu informaciju iz druge teksture u ovu...

Evo ga kod za kreiranje alpha teksture preko DDraw surface-a:

Code:

DDSURFACEDESC2 Desc;  

ZeroMemory( &Desc, sizeof( DDSURFACEDESC2 ));  
Desc.dwSize = sizeof( Desc );  
Desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;  
Desc.ddpfPixelFormat.dwFlags=DDPF_RGB | DDPF_ALPHAPIXELS;
Desc.ddpfPixelFormat.dwRGBBitCount = 32;
Desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
Desc.ddpfPixelFormat.dwRBitMask = 0xFF0000;
Desc.ddpfPixelFormat.dwGBitMask = 0xFF00;
Desc.ddpfPixelFormat.dwBBitMask = 0xFF;
Desc.dwWidth = 64;  
Desc.dwHeight = 64;  
Desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE;  
Desc.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;  
 
lpDD->CreateSurface( &Desc, &TheSurface, 0 );


Sasa

P.S. Ako radis u VB-u verovatno ce ti koristiti sajt gde sam nasao kod za kreiranje teksture: http://www.rookscape.com/vbgaming/tutBV.php
Ostalo nisam uspeo da prevedem jer mi nije poznata GetLockedArray funkcija
Life happens but shit goes on
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: DirectX per-pixel alpha11.12.2004. u 02:38 - pre 205 meseci
Ako ucitas neku texturu koja vec sadrzi alpha vrednosti (recimo *.tga), lepo podesis state-ove zar onda nece raditi? Nisam radio nikad u DX7, ali u DX9 tako radi sasvim lepo... koristio sam plave texture sa alpha kanalom skoro na nuli za crtanje stakla i lepo se videlo. Jedini je problem sto koliko znam prvi treba da iscrtas potpuno vidljive poligone pa onda providne.
 
Odgovor na temu

SashaM
Veliki Bečkerek

Član broj: 28482
Poruke: 213
*.ptt.yu.



+1 Profil

icon Re: DirectX per-pixel alpha12.12.2004. u 00:10 - pre 205 meseci
Cini mi se da DX7 ne moze da ucitava alphu iz tga.
Anyway, uspeo sam da uradim. Nakon kreiranja alpha surfaca ucitavao sam bajtove iz slika i snimio ih na surface preko RGB i alpha maski.

Hvala svima koji su se zainteresovali za problem.
Life happens but shit goes on
 
Odgovor na temu

Dark Icarus
Goran Lalić
Beograd

Član broj: 19775
Poruke: 428
*.nat-pool.bgd.sbb.co.yu.



+2 Profil

icon Re: DirectX per-pixel alpha13.12.2004. u 17:24 - pre 205 meseci
Citat:
SashaM: Cini mi se da DX7 ne moze da ucitava alphu iz tga.
Anyway, uspeo sam da uradim. Nakon kreiranja alpha surfaca ucitavao sam bajtove iz slika i snimio ih na surface preko RGB i alpha maski.

Ček ček ček... da se raskusuramo... ovo me jako interesuje... uzeo si sliku, analizirao je bajt po bajt, konstruisao si nove surface, jedan alpha surface i jedan RGB surface, pravilno distribuirao respektivne bajtove tamo gde su potrebni, a onda si primenio alpha surface na RGB surface kao alpha masku? Pošto koliko ja znam Direct Draw nema alpha maske, mora da si koristio D3D procedure?
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan
 
Odgovor na temu

Dark Icarus
Goran Lalić
Beograd

Član broj: 19775
Poruke: 428
*.nat-pool.bgd.sbb.co.yu.



+2 Profil

icon Re: DirectX per-pixel alpha13.12.2004. u 17:29 - pre 205 meseci
(udarac glavom u zid) zanemari prethodnu poruku, upravo sam video DDPF_ALPHAPIXELS flag u DDS7.SurfaceDesc.lFlags ....
p.s. hvala na linku
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan
 
Odgovor na temu

SashaM
Veliki Bečkerek

Član broj: 28482
Poruke: 213
*.ptt.yu.



+1 Profil

icon Re: DirectX per-pixel alpha13.12.2004. u 22:38 - pre 205 meseci
Kazi ako te zanima kod za kopiranje alpha i RGB bajtova u alpha surface. U principu je modifikacija onog prvog koda koji sam postavio.
Life happens but shit goes on
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.microsoft.com.



+18 Profil

icon Re: DirectX per-pixel alpha14.12.2004. u 18:33 - pre 205 meseci
Ako te interesuje da manipulises 2D slikama, probaj GDI+. GDI+ je vrlo dobar za te stvari.

A ako hoces nesto u 3D, probaj da radis sa DX9 - DX7 je nekoliko godina star. Ti naravno uvek mozes da koristis GDI+ za miksovanje slika i za drugi processing, i onda da pomocu DX7 to izbacis na ekran.
 
Odgovor na temu

Dark Icarus
Goran Lalić
Beograd

Član broj: 19775
Poruke: 428
*.nat-pool.bgd.sbb.co.yu.



+2 Profil

icon Re: DirectX per-pixel alpha14.12.2004. u 19:40 - pre 205 meseci
Citat:
SashaM: Kazi ako te zanima kod za kopiranje alpha i RGB bajtova u alpha surface. U principu je modifikacija onog prvog koda koji sam postavio.
Ne može da škodi :) Samo, da li je metod kompatibilan sa DX9? Ma daj i ako nije... :)
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan
 
Odgovor na temu

SashaM
Veliki Bečkerek

Član broj: 28482
Poruke: 213
*.ptt.yu.



+1 Profil

icon Re: DirectX per-pixel alpha14.12.2004. u 23:24 - pre 205 meseci
DX7 mi je znacajan zato sto podrzava kombinovanje DDrawa i D3D-a, sto sa DX8 i 9 nije moguce (bar koliko sam ja video). Uostalom, tu imam sve sto mi treba tako da drugi API za sada nije potreban.

Ova funkcija vraca alpha surface kao teksturu kombinacijom RGB i alpha (crno-bele) slike. Kao ulaz prihvata imena fajlova od kojih pravi surface i zatim kreira 32-bitnu alpha teksturu i upisuje u nju informarcije iz datih fajlova.
Kod nije koristan za DX8 i veci jer ovi vec imaju ugradjene funkcije za kreiranje alpha tekstura, ali ko zeli da korirsti DX7 (zbog sire kompatibilnosti, mogucnosti kombinacije sa DDraw-om itd) onda ce mu svakako koristiti.

Code:

IDirectDrawSurface7 *CreateAlphaTexture(char *image, char *mask)
{
    DDSURFACEDESC2 Desc,Dimage,Dalpha;  
    int x,y;
    DWORD *ColorB,*AlphaB,*FinalB;
    IDirectDrawSurface7 *AlphaSurface, *ImageSurface, *TheSurface;

    if ((ImageSurface=LoadBitmapSurface(image,FALSE))==NULL)
    {
        return NULL;
    }    

    if ((AlphaSurface=LoadBitmapSurface(mask,FALSE))==NULL)
    {
        SafeRelease(ImageSurface);
        return NULL;
    }    

    ZeroMemory( &Dimage, sizeof( DDSURFACEDESC2 ));  
    Dimage.dwSize = sizeof( Dimage );  
    ZeroMemory( &Dalpha, sizeof( DDSURFACEDESC2 ));  
    Dalpha.dwSize = sizeof( Dalpha );  

    ImageSurface->GetSurfaceDesc(&Dimage);
    AlphaSurface->GetSurfaceDesc(&Dalpha);

    if (Dimage.dwWidth!=Dalpha.dwWidth ||
    Dimage.dwHeight!=Dalpha.dwHeight)
    {
        ShowMessage("error","Alpha and Base Texture Height and Width
 are not Equal");

        SafeRelease(AlphaSurface);
        SafeRelease(ImageSurface);
        return NULL;
    }    
    
    ZeroMemory( &Desc, sizeof( DDSURFACEDESC2 ));  
    Desc.dwSize = sizeof( Desc );  
    Desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;  
    Desc.ddpfPixelFormat.dwFlags=DDPF_RGB | DDPF_ALPHAPIXELS;
    Desc.ddpfPixelFormat.dwRGBBitCount = 32;
    Desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
    Desc.ddpfPixelFormat.dwRBitMask = 0xFF0000;
    Desc.ddpfPixelFormat.dwGBitMask = 0xFF00;
    Desc.ddpfPixelFormat.dwBBitMask = 0xFF;
    Desc.dwWidth = Dimage.dwWidth;  
    Desc.dwHeight = Dimage.dwHeight;  
    Desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE;  
    Desc.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;  
 
    lpDD->CreateSurface( &Desc, &TheSurface, 0 );     
    if (TheSurface==NULL)
    {
        ShowMessage("error","Failed to create alpha surface for %s",image);

        SafeRelease(AlphaSurface);
        SafeRelease(ImageSurface);
        return NULL;
    }    

    ZeroMemory( &Dimage, sizeof( DDSURFACEDESC2 ));  
    Dimage.dwSize = sizeof( Dimage );  
    ZeroMemory( &Dalpha, sizeof( DDSURFACEDESC2 ));  
    Dalpha.dwSize = sizeof( Dalpha );  
    ZeroMemory( &Desc, sizeof( DDSURFACEDESC2 ));  
    Desc.dwSize = sizeof( Desc );  

    ImageSurface->Lock( NULL, &Dimage, DDLOCK_WAIT, NULL );  
    AlphaSurface->Lock( NULL, &Dalpha, DDLOCK_WAIT, NULL );  
    TheSurface->Lock( NULL, &Desc, DDLOCK_WAIT, NULL );  

    DWORD ColorRGBMask = ( DWORD )( Dimage.ddpfPixelFormat.dwRBitMask | 
Dimage.ddpfPixelFormat.dwGBitMask | 
Dimage.ddpfPixelFormat.dwBBitMask );  

    for (y=0;y<Desc.dwHeight;y++)
    {
        ColorB = (DWORD*)(( BYTE* )Dimage.lpSurface + y * Dimage.lPitch);
        AlphaB = (DWORD*)(( BYTE* )Dalpha.lpSurface + y * Dalpha.lPitch);  
        FinalB = (DWORD*)(( BYTE* )Desc.lpSurface + y * Desc.lPitch);  

        for (x=0;x<Desc.dwWidth;x++)
        {
            *FinalB|=((*AlphaB & Dalpha.ddpfPixelFormat.dwRBitMask)*0x100) & 
Desc.ddpfPixelFormat.dwRGBAlphaBitMask;
            *FinalB|=*ColorB & ColorRGBMask; 

            *FinalB++;
            *ColorB++;
            *AlphaB++;
        }
    }

    TheSurface->Unlock( NULL );  
    AlphaSurface->Unlock( NULL );  
    ImageSurface->Unlock( NULL );  
        
    SafeRelease(AlphaSurface);
    SafeRelease(ImageSurface);
    
    return TheSurface;
}    


Sasa
Life happens but shit goes on
 
Odgovor na temu

Dark Icarus
Goran Lalić
Beograd

Član broj: 19775
Poruke: 428
*.sbb.co.yu.



+2 Profil

icon Re: DirectX per-pixel alpha16.12.2004. u 21:14 - pre 205 meseci
Hvala, koristiće!
(Naravno, bićeš ubačen u creditse ako ovo parče koda ikada nađe svoj put do neke moje igre)
In a game of chess you must never let your opponent see your pieces - Zap
Brannigan
 
Odgovor na temu

SashaM
Veliki Bečkerek

Član broj: 28482
Poruke: 213
*.ptt.yu.



+1 Profil

icon Re: DirectX per-pixel alpha16.12.2004. u 23:12 - pre 205 meseci
Nema na cemu. Credits nije obavezan, nisam smislio taj kod vec sam ga samo prepravio.

Sasa
Life happens but shit goes on
 
Odgovor na temu

[es] :: 3D programiranje :: DirectX per-pixel alpha

[ Pregleda: 3668 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.