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

28.06.2003, 11:47

Problem mit 2D-Grafik

Hallo, ich habe nun endlich ein Programm ,dass ein Viereck mit einer Textur malt. Jetzt möchte ich als Übung, ein kleines 2D-Spiel programmieren!
Nur weiß ich leider nicht genau, wie ich weiter machen soll, da das Koordinatensystem genau in der Mitte ist, statt oben links(0/0), so wie es bei Direct Draw ist. Wie muss ich das Umgehen?
Und soll ich alle Bilder einfach 2 Einheiten auf der Z-Achse malen??

DANKE

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

28.06.2003, 11:49

Hi,

wenn Du RHW-Vertizes (transformierte Vertizes) verwendest, dann hast Du dieses Problem nicht. Dann hast Du exakt dasselbe Koordinatensystem wie bei DirectDraw.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

3

28.06.2003, 12:16

danke, leider aber wird mein Viereck jetzt nicht mehr gerended.

Ich habe das Vertexformat umgeändert, so wie es auch im Buch steht!
Hier mal ein kleiner Ausschnitt aus dem Code, ich glaube hier müsste der Fehler liegen:

Quellcode

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
    // Viereck startet an  Position(100, 50, 6)
        g_aTriangle[0].vPosition = tbVector3(100.0f, 50.0f, 6.0f);
        //Bewegung
        g_aTriangle[0].vVelocity = tbVector3(0.0f, 0.0f, 0.0f);
        g_aTriangle[0].vVelocity *= fSpeed;
        // Rotation zurücksetzen
        g_aTriangle[0].vRotation = tbVector3(0.0f, 0.0f, 0.0f);
        // Rotationsgeschwindigkeit ist zufällig auf allen drei Achsen
        g_aTriangle[0].vRotVelocity.x = tbFloatRandom(-1.0f, 1.0f);
        g_aTriangle[0].vRotVelocity.y = tbFloatRandom(-1.0f, 1.0f);
        g_aTriangle[0].vRotVelocity.z = tbFloatRandom(-1.0f, 1.0f);

        // Größe 6
        g_aTriangle[0].fSize = 6.0f;

        // Nun die einzelnen Vertizes generieren
            //Position
            g_aTriangle[0].aVertex[0].vPosition = tbVector3(-1.0f,-1.0f,0.0f);
            g_aTriangle[0].aVertex[1].vPosition = tbVector3( 1.0f,-1.0f,0.0f);
            g_aTriangle[0].aVertex[2].vPosition = tbVector3(-1.0f, 1.0f,0.0f);
            g_aTriangle[0].aVertex[3].vPosition = tbVector3( 1.0f, 1.0f,0.0f);

            //Farbe
            VertexColor.r = 1.0f;;
            VertexColor.g = 1.0f;
            VertexColor.b = 1.0f;

            g_aTriangle[0].aVertex[0].vTex1.u = 0;
            g_aTriangle[0].aVertex[0].vTex1.v = 1;
            g_aTriangle[0].aVertex[1].vTex1.u = 1;
            g_aTriangle[0].aVertex[1].vTex1.v = 1;
            g_aTriangle[0].aVertex[2].vTex1.u = 0;
            g_aTriangle[0].aVertex[2].vTex1.v = 0;
            g_aTriangle[0].aVertex[3].vTex1.u = 1;
            g_aTriangle[0].aVertex[3].vTex1.v = 0;

            g_aTriangle[0].aVertex[0].fRHW = 1;
            g_aTriangle[0].aVertex[1].fRHW = 1;
            g_aTriangle[0].aVertex[2].fRHW = 1;
            g_aTriangle[0].aVertex[3].fRHW = 1;

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

28.06.2003, 12:38

Denk dran, was ich Dir sagte: Du hast nun Bildschirmkoordinaten! Die Koordinaten, die Du benutzt, würden das Rechteck 2 Pixel breit und 2 Pixel hoch groß in die linke obere Bildschirmecke zeichnen (wovon man aber nur einen Pixel sähe).
Denke auch dran, dass die Transformationsmatrizen nun nicht mehr funktionieren (nicht mehr mit IDirect3DDevice9::SetTransform).
Du musst die Transformationen manuell durchführen, z.B. den Positionsvektor zu jedem Vertex selbst addieren.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

5

28.06.2003, 13:07

ahh, danke, hatte ich ganz übersehen!
Wenn er jetzt noch die Textur auf dem Viereck malen würde, wäre es perfekt! :rolleyes:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

28.06.2003, 13:08

Poste mal bitte den gesamten Quelltext.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

7

28.06.2003, 13:28

Quellcode

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
89
90
91
92
93
tbResult InitScene()
{
    HRESULT hResult;
    float fSpeed;
    tbColor VertexColor;

    // Vertexformat setzen - Positions- und Farbangabe
    if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1))) {
        //Fehler beim Setzen des Vertexformats!
        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }

    // Beleuchtung und Culling ausschalten, Dithering aktivieren
    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);

    
    // Viereck startet an  Position(100, 50, 6)
        g_aTriangle[0].vPosition = tbVector3(100.0f, 50.0f, 6.0f);
        //Bewegung
        g_aTriangle[0].vVelocity = tbVector3(0.0f, 0.0f, 0.0f);
        g_aTriangle[0].vVelocity *= fSpeed;
        // Rotation zurücksetzen
        g_aTriangle[0].vRotation = tbVector3(0.0f, 0.0f, 0.0f);
        // Rotationsgeschwindigkeit ist zufällig auf allen drei Achsen
        g_aTriangle[0].vRotVelocity.x = tbFloatRandom(-1.0f, 1.0f);
        g_aTriangle[0].vRotVelocity.y = tbFloatRandom(-1.0f, 1.0f);
        g_aTriangle[0].vRotVelocity.z = tbFloatRandom(-1.0f, 1.0f);

        // Größe 6
        g_aTriangle[0].fSize = 6.0f;

        // Nun die einzelnen Vertizes generieren
            //Position
            g_aTriangle[0].aVertex[0].vPosition = tbVector3(-100.0f,-100.0f,0.0f);
            g_aTriangle[0].aVertex[1].vPosition = tbVector3( 100.0f,-100.0f,0.0f);
            g_aTriangle[0].aVertex[2].vPosition = tbVector3(-100.0f, 100.0f,0.0f);
            g_aTriangle[0].aVertex[3].vPosition = tbVector3( 100.0f, 100.0f,0.0f);

            //Farbe
            VertexColor.r = 1.0f;;
            VertexColor.g = 1.0f;
            VertexColor.b = 1.0f;

            g_aTriangle[0].aVertex[0].Diffuse =(DWORD)(VertexColor);
            g_aTriangle[0].aVertex[1].Diffuse =(DWORD)(VertexColor);
            g_aTriangle[0].aVertex[2].Diffuse =(DWORD)(VertexColor);
            g_aTriangle[0].aVertex[3].Diffuse =(DWORD)(VertexColor);
        

            g_aTriangle[0].aVertex[0].vTex1.u = 0;
            g_aTriangle[0].aVertex[0].vTex1.v = 1;
            g_aTriangle[0].aVertex[1].vTex1.u = 1;
            g_aTriangle[0].aVertex[1].vTex1.v = 1;
            g_aTriangle[0].aVertex[2].vTex1.u = 0;
            g_aTriangle[0].aVertex[2].vTex1.v = 0;
            g_aTriangle[0].aVertex[3].vTex1.u = 1;
            g_aTriangle[0].aVertex[3].vTex1.v = 0;


            g_aTriangle[0].aVertex[0].fRHW = 1;
            g_aTriangle[0].aVertex[1].fRHW = 1;
            g_aTriangle[0].aVertex[2].fRHW = 1;
            g_aTriangle[0].aVertex[3].fRHW = 1;
    
    //Die Textur laden
    if(FAILED(hResult = D3DXCreateTextureFromFileEx(g_pD3DDevice,       // Device
                                                    "EnvMapLeft.bmp",       // 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
                                                    0,                  // Color-Key
                                                    NULL,               // Unwichtig
                                                    NULL,               // Unwichtig
                                                    &g_pTexture)))      // Die Textur
    {
        // Fehler!
        TB_ERROR_DIRECTX("D3DXCreateTextureFromFileEx", hResult,TB_ERROR);
    }

    //Und nund die Textur einsetzen
    g_pD3DDevice->SetTexture(0, g_pTexture);



    return TB_OK;
}



Quellcode

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
tbResult Render(float fNumSecsPassed)
{   

    HRESULT     hResult;
    

    // Den Bildpuffer und den Z-Buffer leeren
    if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 63),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    // Szene beginnen
    g_pD3DDevice->BeginScene();

    // Abhängig von der Zeit die Texturfilter setzen.
    // Alle drei Sekunden werden diese geändert.
    if((int)(g_fTime / 3.0f) % 3 == 0)
    {
        // Bilineare Filter mit linearem MIP-Mapping
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
        SetWindowText(g_hWindow, "Beispielprogramm Nr. 4: Texturen (MIN: Linear, MAG: Linear, MIP: Linear)");
    }
    else if((int)(g_fTime / 3.0f) % 3 == 1)
    {
        // Keine Filter ("PlayStation-Effekt"), auch kein MIP-Mapping
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
        SetWindowText(g_hWindow, "Beispielprogramm Nr. 4: Texturen (MIN: Point, MAG: Point, MIP: None)");
    }
    else
    {
        // Maximaler anisotropischer Filter ohne MIP-Mapping
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAXANISOTROPY,
                                      g_Direct3DParameters.DeviceCaps.MaxAnisotropy);
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
        SetWindowText(g_hWindow, "Beispielprogramm Nr. 4: Texturen (MIN: Anisotropic, MAG: Linear, MIP: None)");
    }

    // Jedes einzelne Dreieck zeichnen
    for(int iTriangle = 0; iTriangle < g_iNumTriangles; iTriangle++)
    {   

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

    // Szene beenden
    g_pD3DDevice->EndScene();

    // Der große Moment: den Bildpuffer sichtbar machen
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

    return TB_OK;
}



Es wird oben links das Viereck gemalt, aber nur ohne Textur. Nach meiner Vermutung, kann es sogar sein, dass er die Textur malt, aber das Viereck keine Beleuchtung besitzt und so schwarz wirkt!

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

8

28.06.2003, 17:57

Und siehst Du leider auch nichts? Soll ich vielleicht mal den gesammten Quellcode(ohne Dll) uploaden??

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

28.06.2003, 18:33

Auf Anhieb fällt mir nichts ein... poste mal Deine Vertex-Struktur. Möglicherweise hast Du da die Daten in der falschen Reihenfolge drin. Die richtige Reihenfolge ist: x, y, z, RHW, Diffuse, Texturkoordinaten.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

10

28.06.2003, 22:54

super, es geht!!!

DANKE

Ich wusste nicht, dass die Reihenfolge so wichtig ist!

Werbeanzeige