Toon posts:

[c++/DirectX] kleur veranderen van een bitmap

Pagina: 1
Acties:

Verwijderd

Topicstarter
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 ?

Verwijderd

Topicstarter
Kom op weet nu niemand wat de oplossing is ???

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
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.

Verwijderd

Topicstarter
Thanks kijk daar heb ik teminste iets aan maar weet iemand iets meer te vertellen misschien ??

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Je kunt de blit functie zelf schrijven en dan kun je het precies zo kleuren als je wilt.

Verwijderd

Topicstarter
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 ??

  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
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):
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 :D :)

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! :)

"The fastest code, is the code that is never called."


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
De pitch is vermoedelijk nog hetzelfde, maar in jouw voorbeeld komt de pitch helemaal niet voor. Kun je trouwens niet beter memcpy aanroepen?

  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
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:
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

  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 11-09 14:32
Op 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
Eh ... specificeer je eens nader, want dan kan ik misschien nog iets leren :? Memcpy?! Voor niet lineair?! Uitgesloten, tenzij je het doet op de manier die ik als laatste regel heb beschreven. Of je kopieert een bitmap naar een andere bitmap van dezelfde grootte.

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