Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Kasenoru

Frischling

  • »Kasenoru« ist der Autor dieses Themas

Beiträge: 79

Beruf: Softwareentwickler

  • Private Nachricht senden

1

16.06.2006, 23:13

Colorkey

Ich habe mich nun VOLLSTÄNDIG von D3DX getrennt, leider ist dadurch ein Problem bei Texturen entstanden.
Ich habe es zwar geschafft eine Bitmap in eine Textur zu kriegen(Dank des Tutorials von Patrick Ullmann, www.germangamedev.de), aber keinen Colorkey.
Ich weiß einfach nicht wie ich das mit dem Colorkey machen soll.
Früher habe ich immer D3DXCreateTextureFromFileEx verwendet, da konnte man immer nen Colorkey als Parameter angeben, aber ich will ja kein D3DX mehr.
Wie kann ich bei Texturen einen Colorkey setzen?
Ich weiß die frage is mal wieder total blöd.

MFG

Kasenoru

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

17.06.2006, 00:41

Du gehst jeden Pixel der Textur durch und vergleichst desen Wert mit dem ColorKey und wenn er identisch ist, dann setzt du den Alphawert des Pixels auf transparent.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

3

17.06.2006, 08:41

Das nennt man jetzt jedoch nicht mehr Colorkey (Handelt sich ja nicht mehr um eine Surface) sondern Alphakey

C-/C++-Quelltext

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
    // Einer Textur einen Alphakey geben

void setAlphakey (::IDirect3DTexture9** texture, unsigned long colorkey, unsigned long alpha)
{
        // Hilfsobjekte

    static ::D3DSURFACE_DESC    describe;
    static ::D3DLOCKED_RECT     rect;

        // Surfacebeschreibung holen

    (*texture)->GetLevelDesc (0, &describe);

        // Textur verriegeln

    (*texture)->LockRect (0, &rect, NULL, 0);

        // 32 Bit Pointer auf Bilddaten in der Textur

    for (unsigned long y=0; y<static_cast<unsigned long>(describe.Height); ++y) 
    {
        for (unsigned long x=0; x<static_cast<unsigned long>(describe.Width); ++x) 
        {
            if ((static_cast<unsigned long*>(rect.pBits))[describe.Width*y+x] == colorkey)
                (static_cast<unsigned long*>(rect.pBits))[describe.Width*y+x] = alpha;
        }
    }

        // Textur entriegeln

    (*texture)->UnlockRect (0);
}
Mit dieser Funktion kann man auch mehrere Alphakeys setzen, Farben vertauschen uvm. Also richtig viele Schweinereien ;)

Um den Alphakey darzustellen benötigt man wie immer eines: Alphablending muß aktiv sein.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

17.06.2006, 10:32

@nix da: Eigentor!

Zitat

...nicht mehr Colorkey (Handelt sich ja nicht mehr um eine Surface) ...


Zitat

static ::D3DSURFACE_DESC describe;


Wenn wir schon am Haarespalten sind, dann aber richtig :P ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

5

17.06.2006, 10:34

Zitat von »"Nox"«

@nix da: Eigentor!

Zitat

...nicht mehr Colorkey (Handelt sich ja nicht mehr um eine Surface) ...


Zitat

static ::D3DSURFACE_DESC describe;


Wenn wir schon am Haarespalten sind, dann aber richtig :P ;)


Dazu kommt ja noch, dass D3DSURFACE_DESC von D3D ist und Kasenoru
will ja nicht mehr mit D3D am Hut haben ;)

EDIT: ich wusste dass ich was falsches gesagt habe ^^ sry :P

Anonymous

unregistriert

6

17.06.2006, 10:38

Nox
Nix da mit Eigentor, les Dir mal die Beschreibung von GetLevelDesc genau durch.

DarkRaider
Lesen lernen ist so eine Sache ne? D3DX nicht D3D!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

17.06.2006, 12:59

Zitat

This method returns a surface description for the level specified by this parameter.


Wie kann es etwas beschreiben, was es nach deiner Meinung nach garnicht mehr ist bzw. kein Bestandteil ist? ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

8

17.06.2006, 13:05

Nox
Mo mo moment mal! Ich habe nicht gesagt das es kein Bestantteil mehr davon ist! Ich habe nur gesagt es ist keine mehr.

Kasenoru

Frischling

  • »Kasenoru« ist der Autor dieses Themas

Beiträge: 79

Beruf: Softwareentwickler

  • Private Nachricht senden

9

17.06.2006, 15:43

hmmm, es funktioniert nur zum Teil, der Alphawert wird irgendwie garnicht beachtet.
Wenn ich z.b. alle Pixel der Texture auf 0x00000000 setze, dann sind sie trotzdem noch sichtbar.

Zitat von »"nix da"«


Um den Alphakey darzustellen benötigt man wie immer eines: Alphablending muß aktiv sein.

Habe ich vielleicht falsche Renderstates/Texturestagestates gesetzt?
Ich habe folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
m_pDirect3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
m_pDirect3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pDirect3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

m_pDirect3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
m_pDirect3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pDirect3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
m_pDirect3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
m_pDirect3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pDirect3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);


Habe ich was vergessen oder warum funktioniert es nicht?

Kasenoru

Frischling

  • »Kasenoru« ist der Autor dieses Themas

Beiträge: 79

Beruf: Softwareentwickler

  • Private Nachricht senden

10

18.06.2006, 01:19

Okay Problem gelöst, schon blöd wenn man ne Textur ohne Alphakanal erstellt^^
Vielen dank für deine Hilfe nix da^^

Werbeanzeige