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

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

1

06.08.2003, 16:33

Problem mit Color-Keying

Hallo,

ich lade die Textur mittels D3DXCreateTextureFromFileEx und gebe beim Parameter Color-Key, (255,0,255) an!
Anschließend rendere ich die Textur:


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
             g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); 
               g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
               g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
               g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

                g_pD3DDevice->SetTexture(0, g_pTexture_Spieler);
         
        if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,              // Dreiecksliste
                                                          2,                                // 2 Dreieck
                                                          g_Spieler.aVertex,                // Vertexdaten
                                                          sizeof(STransformedVertex))))     // Vertexgröße
        {
            // Fehler beim Zeichnen!
            TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
        }

        g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);



Leider aber wird jetzt die Textur gar nicht mehr gezeichnet! Was mache ich falsch???

Danke

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

06.08.2003, 17:22

Das hier geht so nicht:
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

Du sagst Direct3D damit ja, dass der Alphawert durch eine Multiplikation errechnet werden soll. Du sagst aber nicht, was multipliziert werden soll. Gib auch noch D3DTSS_ALPHAARG1 und D3DTSS_ALPHAARG2 an. Z.B. für das erste D3DTA_DIFFUSE und für das zweite D3DTA_TEXTURE, damit Alpha aus Vertex-/Materialfarbe mit Alpha aus Textur (durch Color-Key generiert) multipliziert werden.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

3

06.08.2003, 20:33

danke, bei mir sieht der Code in der Render-Funktion nun so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true); 
            g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
            g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 

            g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
            g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
            g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
         
            g_pD3DDevice->SetTexture(0, g_pTexture_Spieler);


        if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,              // Dreiecksliste
                                                          2,                                // 2 Dreieck
                                                          g_Spieler.aVertex,                // Vertexdaten
                                                          sizeof(STransformedVertex))))     // Vertexgröße
        {
            // Fehler beim Zeichnen!
            TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
        }

        g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);


Leider aber wird die Textur immer noch nicht dargestellt....
Hoffe ihr könnt mir helfen, da ich ohne AlphaBlending nicht gerade viel programmieren kann.......

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

06.08.2003, 21:14

Obiger Code setzt natürlich voraus, dass Du irgendwo auch Alphawerte im Material oder in der Vertexfarbe hast. Ansonsten probiere es mal so:

AlphaOp = SelectArg1
AlphaArg1 = Texture

Und TRUE statt true, aber das dürfte egal sein...

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

5

06.08.2003, 21:28

hm, geht leider nicht!
Es sollte eigentlich ein 2D-Spiel werden, deshalb möchte ich eigentlich auch kein Material verwenden, da ich nicht glaube, dass man damit viel anfangen kann, oder??

Edit: Die Textur wird jetzt übrigens komplett angezeigt, leider eben auch die Farbe (255,0,255)...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

06.08.2003, 21:30

Zeig mal die Stelle, wo Du die Textur lädst!

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

7

06.08.2003, 21:31

hier:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //Die Textur laden
    if(FAILED(hResult = D3DXCreateTextureFromFileEx(g_pD3DDevice,       // Device
                                                    Bild_Name,      // Dateiname
                                                    D3DX_DEFAULT,       // Breite
                                                    D3DX_DEFAULT,       // Höhe
                                                    D3DX_DEFAULT,       // MIP-Maps
                                                    0,                  // Zweck
                                                    D3DFMT_UNKNOWN,     // Format
                                                    D3DPOOL_MANAGED,    // Speicherklasse
                                                    D3DX_FILTER_NONE,   // Filter
                                                    D3DX_DEFAULT,       // MIP-Map-Filter
                                                    (255,0,255),        // Color-Key
                                                    NULL,               // Unwichtig
                                                    NULL,               // Unwichtig
                                                    &g_pTexture_Spieler)))      // 

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

06.08.2003, 21:44

Also sowas hier habe ich noch nie gesehen!
(255, 0, 255)

Was soll das sein? Versuch mal z.B. D3DCOLOR_XRGB(255, 0, 255) anzugeben, oder 0xFFFF00FF...

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

9

06.08.2003, 21:50

Juhu!!! :angel:

Danke, funktioniert. Ich hätte noch eine Bitte, könntest du das, vielleicht in der 2. Auflage auf Seite 246 so schreiben, mich hat das tbColor(255, 0, 0) verwirrt, da ich das ursprünglich angegeben hatte und es natürlich nicht funktionierte!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

06.08.2003, 21:53

Wenn Du den Byte-Konstruktor von tbColor nimmst (also von 0 bis 255), dann musst Du den ersten Parameter explizit als Byte angeben, also (BYTE)(255), sonst denkt der Compiler scheinbar, dass Du den float-Konstruktor meinst. Das steht auch irgendwo.
In dem Fall hätte tbColor(1.0f, 0.0f, 0.0f) es auch tun müssen. Aber ich werde es reinschreiben!

Edit: Habe grade gemerkt, dass es ja tatsächlich falsch da drin steht! DANKE!!! :)

Werbeanzeige