[ eva01 @ 30.11.2005. 14:54 ] @
Treba da učitam teksturu sa alfa kanalom. Problem mi je što se RGB komponente nalaze u jednom fajlu a alfa komponenta u drugom. Do sada sam koristio D3DX funkcije za pravljenje teksture.

Buni me sledeće stvar: Ako budem učitavo alfa komponentu preko D3DXLoadSurfaceFromFile šta da stavim kao format "površine"? Nije mi jasno zato što tekstura sa alfa kanalom je ustvari crno-bela tekstura i to još od 256 boja (recimo png format) a to znači da ima paletu. Da li moram da je učitam prvo kao recimo X8R8G8B8 (podrazumevam da će d3dx izvršiti konverziju iz 256 boja u 24 bitnu paletu) a onda vršim konverziju u alfa kanal ili mogu da stavim D3DFMT_A8?

Evo ovako sam nameravio da odradim stvar:
1) kreiram rgba teksturu čitanjem fajla sa teksturom (bez alfa komponente)
2) učitam u surface alfa komponentu (tj. izvršim konverziju ako treba) iz drugog fajla
3) iz surfacea sa alfa komponentom dodam, alfa u surface teksture
4) napravim mipmape

Jel možda ima nešto odrađeno D3DX-u za ovakve slučajeve?

[Ovu poruku je menjao eva 01 dana 30.11.2005. u 19:05 GMT+1]
[ tosa @ 01.12.2005. 01:45 ] @
Mozes uvek da teksturu napravis "rucno", pa da popunis buffer podacima koje zelis.
Na taj nacin imas punu kontrolu sta ce biti sadrzaj iste.
Mozes da uradis i sledecu stvar:
ucitas texturu bez alfa kanala, pa onda blitujes preko nje alpha texturu ali iskljucis
R,G i B color write, tako da se upise samo alfa. Naravno za ovo ces morati da
se poigras sa render state-ovima i slicnim cudima, tako da sam ja uvek za opciju #1.
[ dragansm @ 12.12.2005. 11:41 ] @
Pogledaj source za Direct Texture Tool koji se nalazi u DirectX SDK. Potrazi funkciju:
Citat:

HRESULT CDxtexDoc::LoadAlphaIntoSurface(CString& strPath, LPDIRECT3DSURFACE9 psurf)
{
HRESULT hr;
D3DSURFACE_DESC sd;
LPDIRECT3DDEVICE9 pd3ddev = PDxtexApp()->Pd3ddev();
LPDIRECT3DTEXTURE9 ptexAlpha;
LPDIRECT3DSURFACE9 psurfAlpha;
LPDIRECT3DSURFACE9 psurfTarget;

psurf->GetDesc(&sd);

// Load the alpha BMP into psurfAlpha, a new A8R8G8B8 surface
hr = D3DXCreateTextureFromFileEx(pd3ddev, strPath, sd.Width, sd.Height, 1, 0,
D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_FILTER_TRIANGLE,
D3DX_FILTER_TRIANGLE, 0, NULL, NULL, &ptexAlpha);
hr = ptexAlpha->GetSurfaceLevel(0, &psurfAlpha);

// Copy the target surface into an A8R8G8B8 surface
hr = pd3ddev->CreateOffscreenPlainSurface(sd.Width, sd.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &psurfTarget, NULL);
hr = D3DXLoadSurfaceFromSurface(psurfTarget, NULL, NULL, psurf, NULL, NULL,
D3DX_FILTER_TRIANGLE, 0);

// Fill in the alpha channels of psurfTarget based on the blue channel of psurfAlpha
D3DLOCKED_RECT lrSrc;
D3DLOCKED_RECT lrDest;

hr = psurfAlpha->LockRect(&lrSrc, NULL, D3DLOCK_READONLY);
hr = psurfTarget->LockRect(&lrDest, NULL, 0);

DWORD xp;
DWORD yp;
DWORD* pdwRowSrc = (DWORD*)lrSrc.pBits;
DWORD* pdwRowDest = (DWORD*)lrDest.pBits;
DWORD* pdwSrc;
DWORD* pdwDest;
DWORD dwAlpha;
LONG dataBytesPerRow = 4 * sd.Width;

for (yp = 0; yp < sd.Height; yp++)
{
pdwSrc = pdwRowSrc;
pdwDest = pdwRowDest;
for (xp = 0; xp < sd.Width; xp++)
{
dwAlpha = *pdwSrc << 24;
*pdwDest &= 0x00ffffff;
*pdwDest |= dwAlpha;

pdwSrc++;
pdwDest++;
}
pdwRowSrc += lrSrc.Pitch / 4;
pdwRowDest += lrDest.Pitch / 4;
}

psurfAlpha->UnlockRect();
psurfTarget->UnlockRect();

// Copy psurfTarget back into real surface
hr = D3DXLoadSurfaceFromSurface(psurf, NULL, NULL, psurfTarget, NULL, NULL,
D3DX_FILTER_TRIANGLE, 0);

// Release allocated interfaces
ReleasePpo(&psurfTarget);
ReleasePpo(&psurfAlpha);
ReleasePpo(&ptexAlpha);

return S_OK;
}

[ eva01 @ 12.12.2005. 12:06 ] @
Hvala na pomoći, već sam se snašao ali tek sada sam provalio da se dobijaju sorsevi za alate.