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

1

12.07.2008, 17:03

Textur bleibt schwarz

Das Problem gabs hier im Forum bestimmt schon oft genug. Aber ich find meinen Fehler einfach nicht. Gerendert wird ein Rechteck mit Textur, welche leider schwarz bleibt

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
VOID Render()
{
    // Backbuffer säubern und mit schwarz füllen

    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
    // Szene beginnen

    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
    renderSprites();
        // Szene beenden

        g_pd3dDevice->EndScene();
    }

    struct Vector2D // Struktur für Texelkoordinaten

    {
        float x;
        float y;
    };

    struct SVertex  // Struktur für Vertices

    {
        D3DVECTOR   vPosition;
        float       fRHW;
        D3DCOLOR    Color;
        Vector2D    vTex0;
    };

    g_pd3dDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
    g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
    g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);

    SVertex aVertex[4];
    aVertex[0].vPosition.x = 50.0f;
    aVertex[1].vPosition.x = 500.0f;
    aVertex[2].vPosition.x = 50.0f;
    aVertex[3].vPosition.x = 500.0f;

    aVertex[0].vPosition.y = 50.0f;
    aVertex[1].vPosition.y = 50.0f;
    aVertex[2].vPosition.y = 500.0f;
    aVertex[3].vPosition.y = 500.0f;

    aVertex[0].vPosition.z = 1.0f;
    aVertex[1].vPosition.z = 1.0f;
    aVertex[2].vPosition.z = 1.0f;
    aVertex[3].vPosition.z = 1.0f;

    aVertex[0].Color = 1;
    aVertex[1].Color = 1;
    aVertex[2].Color = 1;
    aVertex[3].Color = 1;

    aVertex[0].vTex0.x = 0.0f;
    aVertex[1].vTex0.x = 1.0f;
    aVertex[2].vTex0.x = 0.0f;
    aVertex[3].vTex0.x = 1.0f;
    aVertex[0].vTex0.y = 0.0f;
    aVertex[1].vTex0.y = 0.0f;
    aVertex[2].vTex0.y = 1.0f;
    aVertex[3].vTex0.y = 1.0f;

    aVertex[0].fRHW = 1.0f;
    aVertex[1].fRHW = 1.0f;
    aVertex[2].fRHW = 1.0f;
    aVertex[3].fRHW = 1.0f;

    // Textur erzeugen

    if(g_pd3dDevice->CreateTexture(256,256,0,NULL,D3DFMT_X8R8G8B8, 
                                D3DPOOL_MANAGED ,&g_Texture,0)!=D3D_OK)
        MessageBox(NULL, "Fehler beim Erstellen der Textur", "Texturfehler",MB_OK);


    D3DLOCKED_RECT lockedRect;

    g_Texture->LockRect(0, &lockedRect, NULL,0);

    // Textur einfärben

    for (int i = 0; i < 256; i++) 
        for (int j = 0; j < 256; j++) 
        { 
            ((DWORD*)lockedRect.pBits)[256*j+i] = 0xff00ff00; 
        } 


    g_Texture->UnlockRect(0);
    g_pd3dDevice->SetTexture(0, g_Texture);
    g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex, sizeof(SVertex));
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}


Vielleicht hab ich auch einen Fehler beim Einfärben (->LockedRect ...) gemacht.

2

12.07.2008, 17:15

Möglicherweise liegts am fehlenden g_pd3dDevice->EndScene() ?
(welches vor g_pd3dDevice->Present kommen sollte)

3

12.07.2008, 17:58

Ich hab g_pd3dDevice->EndScene() jetz mal direkt über die Present-Methode geschoben, aber das hat leider nichts geändert. :(

4

12.07.2008, 18:14

Dann würde ich es erstmal mit einer stinknormalen Textur (aus Datei) probieren, um zu sehen, ob mit deinem Vertexbuffer alles Ok ist.
Vielleicht liegts auch am Cullmode, D3DTSS_COLOROP... o.ä.

5

12.07.2008, 22:56

Ok ich hab den Fehler. Hab vergessen die Texturstages zu setzen

g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);

;)

und vielen Dank für die schnellen Antworten @TrikkieMikkie !!

Anonymous

unregistriert

6

13.07.2008, 00:59

Nur mal so ne blöde Frage: Was ist in D3DCOLOR (DWORD) ein Wert von 1?

Also bei dem Format: 0xAARRGGBB wäre das 0x00000001, also extrem dunkles blau und nicht sichtbar. Da aber Alphablending aus zu sein scheint, machen wir mal ein 0xFF000001 draus. Sieht für mich auch noch Schwarz aus, oder hab ich da jetzt was falsches gesagt? :roll:

7

13.07.2008, 09:19

Zitat von »"Humpenface"«

und vielen Dank für die schnellen Antworten @TrikkieMikkie !!

Kein Problem, war grad in der Gegend... ;)

@unsigned long
Durch D3DTOP_SELECTARG1 verwendet er ja momentan nur die Texturfarbe, oder nicht?
Vermute, um den Diffuse-Kram kümmert er sich später. Anders kann ich mir die relevanten Codeabschnitte nicht erklären.

Werbeanzeige