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

29.08.2006, 21:30

Laden einer Texture und darstellen auf einem statischen 3Eck

Ich versuche mich daran ein 256x256 Bitmap auf mein dreieck drauf zu rendern, aber das funktioniert nicht so richtig. mein dreieck wird angezeigt, bleibt aber schwarz(halt farblos, da ich keine farben setze). die texture ist da und findet er auch. nur er rendert sie nicht auf das dreieck.

da das dreieck statisch sein soll, spielt sich das interessante eigentlich nur in der initscene ab.

hier mal der code:

die init scene

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
tbResult InitScene()
{
    HRESULT     hResult;
    tbMatrix    mProjection;
    float       fAspect;


    // Vertexformat setzen - Positions- und Farbangabe

    if(FAILED(hResult = g_pD3DDevice->SetFVF(SVertex::dwFVF)))
    {
        // 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);

    // Das Bildseitenverhältnis berechnen

    fAspect =   (float)(g_Direct3DParameters.VideoMode.Width)
              / (float)(g_Direct3DParameters.VideoMode.Height);

    // Die Projektionsmatrix erzeugen

    mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),  // Sichtfeld: 90° (180°)

                                     fAspect,               // Bildseitenverhältnis

                                     0.5f,                  // Nahe Clipping-Ebene

                                     100.0f);               // Ferne Clipping-Ebene


    // Projektionsmatrix einsetzen

    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));

    // Initialisieren des Dreiecks


    g_aTriangleVertex[0].vPosition  = tbVector3( -1.0f,  -1.0f, 0.0f);
    g_aTriangleVertex[0].vTexture.u = tbFloatRandom(-1.0f, 2.0f);
    g_aTriangleVertex[0].vTexture.v = tbFloatRandom(-1.0f, 2.0f);

    g_aTriangleVertex[1].vPosition  = tbVector3( 0.0f,  1.0f, 0.0f);
    g_aTriangleVertex[1].vTexture.u = tbFloatRandom(-1.0f, 2.0f);
    g_aTriangleVertex[1].vTexture.v = tbFloatRandom(-1.0f, 2.0f);

    g_aTriangleVertex[2].vPosition  = tbVector3( 1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[2].vTexture.u = tbFloatRandom(-1.0f, 2.0f);
    g_aTriangleVertex[2].vTexture.v = tbFloatRandom(-1.0f, 2.0f);

    TB_INFO("Bin vor CreateTextureFromFileEx-Funktion");
    if(FAILED(hResult = D3DXCreateTextureFromFileEx(g_pD3DDevice, 
                                                    "Texture.bmp", 
                                                    D3DX_DEFAULT,
                                                    D3DX_DEFAULT,
                                                    D3DX_DEFAULT,
                                                    0,
                                                    D3DFMT_UNKNOWN,
                                                    D3DPOOL_MANAGED,
                                                    D3DX_FILTER_NONE,
                                                    D3DX_DEFAULT,
                                                    0,
                                                    NULL,
                                                    NULL,
                                                    &g_pTexture)))
    {
        TB_ERROR_DIRECTX("D3DXCreateTextureFromFileEx", hResult, TB_ERROR);
    }

    g_pD3DDevice->SetTexture(0, g_pTexture);

    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);


    return TB_OK;
}


und das rendern

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
tbResult Render(float fNumSecsPassed)
{
    HRESULT     hResult;
    tbMatrix    mRotation;      // Rotationsmatrix

    tbMatrix    mTranslation;   // Translationsmatrix

    tbMatrix    mWorld;         // Vereinende Weltmatrix



    // Rotations- und Translationsmatrix des Dreiecks erzeugen

    mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f));
    mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f));
    
    // Beide Matrizen kombinieren und als Weltmatrix einsetzen

    mWorld = mRotation * mTranslation;
    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));

    // -------------------------------------------------------------


    // 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!

        MessageBox(g_hWindow, "Fehler beim Leeren der Puffer!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    // Szene beginnen

    g_pD3DDevice->BeginScene()  ;
    
    // Nun das Dreieck zeichnen

    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP ,                     // Dreiecksliste

                                                      1,                    // 1 Dreieck

                                                      g_aTriangleVertex,    // Vertexdaten

                                                      sizeof(SVertex))))   // Vertexgröße

    {
        MessageBox(NULL, "Fehler", "Fehler", MB_ICONEXCLAMATION);
    }
    
    // Szene beenden

    g_pD3DDevice->EndScene();

    // Der große Moment: den Bildpuffer sichtbar machen

    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

    return TB_OK;
}


mein g_aTriangleVertex ist von diesem Typ:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct SVertex
{
    tbVector3           vPosition;  // Position des Vertex

    DWORD               dwColor;    // Farbe des Vertex

    tbVector2           vTexture;
    static const DWORD  dwFVF;      // Vertexformat (statisch)

};

const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;


erkennt jemand einen fehler?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

29.08.2006, 21:47

Du weist allen 3 Eckpunkten dieselben Texturkoordinaten zu.
Wundert es dich da noch, dass du keine Textur siehst?

3

29.08.2006, 21:52

Zitat von »"David Scherfgen"«

Du weist allen 3 Eckpunkten dieselben Texturkoordinaten zu.
Wundert es dich da noch, dass du keine Textur siehst?


wieso das? ich fülle die .u bzw .v doch mit floatRandom(float a, float b)

ist ein kleiner bereich, aber ich müsste doch irgendetwas sehen?!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

29.08.2006, 22:10

Ups, sorry. Hatte gar nicht gesehen, dass da diese Random-Funktion war.
Aber die Vertexfarbe lässt du undefiniert. Die ist dann wahrscheinlich schwarz, und Schwarz * Farbe ergibt Schwarz.

5

30.08.2006, 07:49

Zitat von »"David Scherfgen"«

Ups, sorry. Hatte gar nicht gesehen, dass da diese Random-Funktion war.
Aber die Vertexfarbe lässt du undefiniert. Die ist dann wahrscheinlich schwarz, und Schwarz * Farbe ergibt Schwarz.


die textur leg ich doch eigentlich darüber?! deswegen bin davon ausgegangen das es egal ist welche farbe ich dem dreieck gebe, sehen tu ich davon ja ohnehin nichts. oder ist das falsch?!

muss ein objekt eine bestimmte farbe habe um eine texture zu bekommen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

30.08.2006, 08:58

Wenn du denkst, die Farbe sei egal - warum definierst du sie dann im Vertexformat? Hättest du sie weggelassen, hätte es funktioniert.
Ansonsten interpoliert D3D die Vertexfarben der Eckpunkte und multipliziert die für jeden Pixel mit der Farbe der Textur. So zeigt es ja auch das Beispielprogramm "04 - Texturen".

7

30.08.2006, 13:45

Zitat von »"David Scherfgen"«

Wenn du denkst, die Farbe sei egal - warum definierst du sie dann im Vertexformat? Hättest du sie weggelassen, hätte es funktioniert.
Ansonsten interpoliert D3D die Vertexfarben der Eckpunkte und multipliziert die für jeden Pixel mit der Farbe der Textur. So zeigt es ja auch das Beispielprogramm "04 - Texturen".


ok danke, werd ich mal ausprobieren.

D.h also, wenn meine Figur eine Texture benutzen soll, darf die Figuren kein eigenen Farben haben(es sei den ich will das sich farben und texture mischen/interpolieren)- richtig?

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

8

30.08.2006, 13:53

interpoliern != mischen!

ansonsten true! ;)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

30.08.2006, 13:53

... oder als Farbe Weiß nehmen, denn Farbe * Weiß = Farbe

10

30.08.2006, 15:20

Ok, danke für die Antworten :)

Werbeanzeige