Hier ff een directdraw vraagje. Ik heb een witte letter op een bitmap. Deze letter kopieer ik dan op een surface maar als ik nu deze bijvoorbeeld in de kleur groen wil laten veranderen (dus de gebruiker ziet dan een groene letter ipv een witte terwijl de letter wel wit is op de bitmap). Is dit mogelijk en zo ja hoe zou ik dat moeten gaan doen ?
Ik weet niet of dit met DD kan. Maar met D3D kun je de bitmap als alpha opvatten en dan alpha * vaste kleur opgeven om die bitmap te tekenen.
Je kunt de blit functie zelf schrijven en dan kun je het precies zo kleuren als je wilt.
Dat is wel heel makkelijk gezegd maar hoe doe je zoiets ?? Heb je misschien url's ofzo of een uitleg over hoe zoiets in zijn werk gaat ??
Als je de blit zelf wilt implementeren, kun je het bijvoorbeeld zo doen.
Wat je kunt doen is een pointer naar de surface (dat is dus het geheugen gebied waar je bitmap in staat) opvragen en een pointer naar de surface waar je het naar toe wilt kopieren.
Het opvragen van pointers gaat middels de functie LockRect van de IDirect3DSurface8 interface. Je moet daar als parameter een structure mee geven. Dat structure wordt gevuld door de 'lock' functie. Jij hebt in dat structure dan een directe pointer naar de data op je surface. Voorbeeld code (snel in elkaar geflanst, fouten voorbehouden, en moet meer gezien worden als PSEUDO-code):
Check ook even hoe de 'pitch' in DirectX 8 werkt. Ik programmeer namelijk nog steeds in DirectX 7 en sommige dingen zijn net even anders. Ik heb dit maar effe snel uit de SDK van 8 getrokken van de MS site

De RECT structure hoef je niet perse op te geven voor 'destination'. Je kan daar net als bij 'source' ook gewoon NULL voor in de 'lock' functie gooien. Maar dan moet je bij het kopierstukje (in de loop) voor de 'destination' wel berekenen waar je de pixel naar toe wilt kopieren op de surface. Dus pseudo code:
pDest[iX + (iY * SchermHoogte)
Hoop je voldoende PSEUDO (ik kan het maar niet vaak genoeg benadrukken
) informatie te hebben gegeven.
Links:
www.gamedev.net
www.programmersheaven.com
Good luck and have fun!
Wat je kunt doen is een pointer naar de surface (dat is dus het geheugen gebied waar je bitmap in staat) opvragen en een pointer naar de surface waar je het naar toe wilt kopieren.
Het opvragen van pointers gaat middels de functie LockRect van de IDirect3DSurface8 interface. Je moet daar als parameter een structure mee geven. Dat structure wordt gevuld door de 'lock' functie. Jij hebt in dat structure dan een directe pointer naar de data op je surface. Voorbeeld code (snel in elkaar geflanst, fouten voorbehouden, en moet meer gezien worden als PSEUDO-code):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| LPDIRECT3DSURFACE8 pSource = ???; // Tja, dat is dus je bron
LPDIRECT3DSURFACE8 pDest = ???; // Tja, dat is dus je
// destination (bijv. je
// primary surface of front
// buffer)
void Blit (int iXDestination, int iYDestination)
{
int iNrOfPixels = ???; // tja, dit zul je dus zelf effe
// moeten berekenen.
D3DLOCKED_RECT sSourceLockRect,
sDestLockRect;
BYTE *pSourceData = NULL;
BYTE *pDestData = NULL;
RECT sRect; // Dit structure moet je vullen met de
// coordinaten waar op het scherm (dus
// primary surface/front buffer) je de data
// wilt kopieren!)
if (pSource->LockRect(&sSourceLockRect, NULL, D3DLOCK_READONLY) != D3D_OK)
{
// FOUT!
return;
}
if (pDest->LockRect(&sDestLockRect, NULL, 0) != D3D_OK)
{
// FOUT!
return;
}
pSourceData = (BYTE *D sSourceLockRect.pBits;
pDestData = (BYTE *D sDestLockRect.pBits;
for (i = 0; i < iAantalPixels; i++)
{
pDestData[i] = pSourceData[i];
}
// Vergeet niet de boel weer te unlocken met UnlockRect
} |
Check ook even hoe de 'pitch' in DirectX 8 werkt. Ik programmeer namelijk nog steeds in DirectX 7 en sommige dingen zijn net even anders. Ik heb dit maar effe snel uit de SDK van 8 getrokken van de MS site
De RECT structure hoef je niet perse op te geven voor 'destination'. Je kan daar net als bij 'source' ook gewoon NULL voor in de 'lock' functie gooien. Maar dan moet je bij het kopierstukje (in de loop) voor de 'destination' wel berekenen waar je de pixel naar toe wilt kopieren op de surface. Dus pseudo code:
pDest[iX + (iY * SchermHoogte)
Hoop je voldoende PSEUDO (ik kan het maar niet vaak genoeg benadrukken
Links:
www.gamedev.net
www.programmersheaven.com
Good luck and have fun!
"The fastest code, is the code that is never called."
De pitch is vermoedelijk nog hetzelfde, maar in jouw voorbeeld komt de pitch helemaal niet voor. Kun je trouwens niet beter memcpy aanroepen?
Ik heb inderdaad de 'pitch' niet gebruikt. Er stond ook duidelijk een aantal keren pseudo code. Ik ga ervan uit dat mensen ook zelf wat dingen uitzoeken, zonder dat alles voorgekauwd wordt. Vandaar

De functie memcpy is een hele handige functie indien je een lineair geheugengebied wilt kopieren naar een ander stuk lineair geheugengebied. Met andere woorden, alles wat je wilt kopieren moet achter elkaar staan. Bij een bitmap staan de pixels (in de meeste gevallen) niet achter elkaar, tenzij je een bitmap hebt van bijv 320 pixels breed en 1 hoog.
Voorbeeld:
Dit soort dingen kun je met memcpy dus niet kopieren, want memcpy gaat ervan uit dat de respectievelijke te kopieren bytes achter elkaar staan. Dan moet je dus memcpy gaan aanroepen voor iedere rij pixels dan kan het weer wel, maar of je dat wilt .....
De functie memcpy is een hele handige functie indien je een lineair geheugengebied wilt kopieren naar een ander stuk lineair geheugengebied. Met andere woorden, alles wat je wilt kopieren moet achter elkaar staan. Bij een bitmap staan de pixels (in de meeste gevallen) niet achter elkaar, tenzij je een bitmap hebt van bijv 320 pixels breed en 1 hoog.
Voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
| Scherm -------------------------------------- | | | | | bitmapje | | ----- | | | | | | | | | | ----- | -------------------------------------- |
Dit soort dingen kun je met memcpy dus niet kopieren, want memcpy gaat ervan uit dat de respectievelijke te kopieren bytes achter elkaar staan. Dan moet je dus memcpy gaan aanroepen voor iedere rij pixels dan kan het weer wel, maar of je dat wilt .....
"The fastest code, is the code that is never called."
Verwijderd
Memcopy is heel goed te gebruiken voor het kopieeren van bitmaps. Alleen niet in combinatie met windows. BitBlt komt aardig in de buurt
Eh ... specificeer je eens nader, want dan kan ik misschien nog iets lerenOp zondag 10 maart 2002 21:54 schreef robh het volgende:
Memcopy is heel goed te gebruiken voor het kopieeren van bitmaps. Alleen niet in combinatie met windows. BitBlt komt aardig in de buurt
Bitblt, hmmm. Het ging hierover het zelf schrijven van zo'n routine. Wat ik beschrijf is een hele simpele manier, met pseudo code omschreven met de achterliggende gedachte dat iemand zelf ook wat uitzoekt
"The fastest code, is the code that is never called."
Pagina: 1