Du bist nicht angemeldet.

Werbeanzeige

NicoH

Treue Seele

  • »NicoH« ist der Autor dieses Themas

Beiträge: 89

Wohnort: Elsterwerda

Beruf: Student Informatik

  • Private Nachricht senden

1

30.05.2006, 18:57

Textur wird nicht gezeichnet...

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
struct STransformedVertex
{
    tbVector3           vPosition;  // Position des Vertex

    float fRHW;
    D3DCOLOR         Diffuse;   
    tbVector2 vTex1;

    static const DWORD dwFVF;
};
const DWORD STransformedVertex::dwFVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(1);


// ******************************************************************

// Globale Variablen

SDirect3DParameters g_Direct3DParameters;   // Direct3D-Parameter

float               g_fTime = 0.0f;         // Zeitzähler

STransformedVertex  aVertex[4]; 
PDIRECT3DTEXTURE9   g_pTexture = NULL;  

// ******************************************************************

// Render-Funktion

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(50, 20, 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();
    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, "haha");



    //for (int i = 0; i< ; i++){




    // Nun das Dreieck zeichnen

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

                                                      2,                    // 1 Dreieck

                                                      aVertex,  // Vertexdaten

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

    {
        // Fehler beim Zeichnen!

        MessageBox(g_hWindow, "Fehler beim Zeichnen des Dreiecks!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        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;
}

// ******************************************************************

// Move-Funktion

tbResult Move(float fNumSecsPassed)
{
    // Zeitzähler erhöhen

    g_fTime += fNumSecsPassed;

    return TB_OK;
}

// ******************************************************************

// Herunterfahren der Szene

tbResult ExitScene()
{
    g_pD3DDevice->SetTexture(0, NULL);
    TB_SAFE_RELEASE(g_pTexture);
    return TB_OK;
}

// ******************************************************************

// Herunterfahren der Anwendung

tbResult ExitApplication()
{
    // Szene herunterfahren

    ExitScene();

    // Direct3D und Fenster herunterfahren

    ExitDirect3D();
    ExitWindow();

    // Engine herunterfahren

    tbExit();

    return TB_OK;
}

// ******************************************************************

// Initialisieren der Szene

tbResult InitScene()
{
    HRESULT     hResult;
    tbMatrix    mProjection;
    float       fAspect;


    // Vertexformat setzen - Positions- und Farbangabe

    if(FAILED(hResult = g_pD3DDevice->SetFVF(STransformedVertex::dwFVF)))
    {
        // Fehler beim Setzen des Vertexformats!

        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }


g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVDESTALPHA);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_PREMODULATE);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
g_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);

    // 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.1f,                  // Nahe Clipping-Ebene

                                     100.0f);               // Ferne Clipping-Ebene


    // Projektionsmatrix einsetzen

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

    // Initialisieren der Dreiecke


    aVertex[0].fRHW = 1;
    aVertex[1].fRHW = 1;
    aVertex[2].fRHW = 1;
    aVertex[3].fRHW = 1;
   aVertex[0].vPosition = tbVector3( 0.0f, 0.0f, 0.0f);
   aVertex[1].vPosition = tbVector3(  300.0f, 0.0f, 0.0f);
   aVertex[2].vPosition = tbVector3(  0.0f, 300.0f, 0.0f);
   aVertex[3].vPosition = tbVector3( 300.0f, 300.0f, 0.0f);

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

    // Die Textur laden

    if(FAILED(hResult = D3DXCreateTextureFromFileEx (
        g_pD3DDevice,       // Device

        "spezial_bon.bmp",      // Dateiname

        D3DX_DEFAULT,       // Breite

        D3DX_DEFAULT,       // Höhe

        D3DX_DEFAULT,       // MIP-Maps

        0,                  // Verwendungszweck

        D3DFMT_UNKNOWN,     // Format

        D3DPOOL_MANAGED,    // Speicherklasse

        D3DX_FILTER_NONE,   // Filter

        D3DX_DEFAULT,       // MIP-Map-Filter

        tbColor(0.0f, 0.0f, 0.0f),                  // Color-Key

        NULL,               // Unwichtig

        NULL,               // Unwichtig

        &g_pTexture)))      // Die Textur

    {
        // Fehler!

        TB_ERROR_DIRECTX("D3DXCreateTextureFromFileEx", hResult, TB_ERROR);
    }

    // Und nun die Textur einsetzen

    g_pD3DDevice->SetTexture(0, g_pTexture);


    return TB_OK;
}


tjo muss man etwas anders machen, wenn man eine textur über 2 Dreiecke zeichnen möchte???
mfg NicoH

3 Wichtige Regeln des Programmierers:
- Nur in der Nacht programmieren
- Viel Kaffe und kalte Pizza im Vorrat haben (Cola geht auch ;))
- Keine Freundin (sie stört im wichtigsten Augenblick)

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

30.05.2006, 19:37

Re: Textur wird nicht gezeichnet...

Zitat von »"NicoH"«

C-/C++-Quelltext

1
D3DFVF_TEXCOORDSIZE3(1);

Was soll das?
Du sagst Direct3D hiermit, dass das zweite Set an Texturkoordinaten drei floats groß ist (also ein 3D-Vektor!).
Du verwendest aber gar kein zweites Set Texturkoordinaten, sondern nur eins, und das ist ein 2D-Vektor.

Richtig wäre also D3DFVF_TEXCOORDSIZE2(0), aber das kannst du dir sparen, weil 2D-Texturkoordinaten standardmäßig eingestellt sind.

NicoH

Treue Seele

  • »NicoH« ist der Autor dieses Themas

Beiträge: 89

Wohnort: Elsterwerda

Beruf: Student Informatik

  • Private Nachricht senden

3

30.05.2006, 20:03

Danke, jetzt weiß ich wie das zusammen hängt!
mfg NicoH

3 Wichtige Regeln des Programmierers:
- Nur in der Nacht programmieren
- Viel Kaffe und kalte Pizza im Vorrat haben (Cola geht auch ;))
- Keine Freundin (sie stört im wichtigsten Augenblick)

NicoH

Treue Seele

  • »NicoH« ist der Autor dieses Themas

Beiträge: 89

Wohnort: Elsterwerda

Beruf: Student Informatik

  • Private Nachricht senden

4

30.05.2006, 20:26

also ich habe es gelöscht, aber trotzdem wird das bild nicht gezeichnet,... bzw die textur.... erst dachte ich das bild hat die falsche größe also habe ich es auf 256x 256 geändert... das brahcte aber auch nichts...
mfg NicoH

3 Wichtige Regeln des Programmierers:
- Nur in der Nacht programmieren
- Viel Kaffe und kalte Pizza im Vorrat haben (Cola geht auch ;))
- Keine Freundin (sie stört im wichtigsten Augenblick)

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

30.05.2006, 20:29

- Warum hast du Alpha-Testing aktiviert?
- Warum verwendest du D3DTOP_PREMODULATE?
- Warum verwendest du D3DBLEND_SRCALPHA zusammen mit D3DBLEND_INVDESTALPHA?

NicoH

Treue Seele

  • »NicoH« ist der Autor dieses Themas

Beiträge: 89

Wohnort: Elsterwerda

Beruf: Student Informatik

  • Private Nachricht senden

6

30.05.2006, 20:32

Nah um dem Colorkey funktionstüchtig zu machen so steht es doch im Kapitel 2. 15 ---> 2D Grafik nachahmen

/edit:

oder muss ich dann noch die Streufarbe setzen?
mfg NicoH

3 Wichtige Regeln des Programmierers:
- Nur in der Nacht programmieren
- Viel Kaffe und kalte Pizza im Vorrat haben (Cola geht auch ;))
- Keine Freundin (sie stört im wichtigsten Augenblick)

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

30.05.2006, 20:33

Wenn du schon Alpha-Testing aktivierst, dann musst du auch eine Alpha-Test-Funktion und einen Referenzwert angeben!
Noch eine Frage: Du setzt die Render-States für Alpha-Blending, aber du aktivierst Alpha-Blending nirgendwo. Sicher, dass du nicht Alpha-Testing mit Alpha-Blending verwechselst?

So wie du das hier geschrieben hast, steht es jedenfalls nicht in meinem Buch, zumindest nicht in diesem Zusammenhang.

Nimm erstmal die ganzen Render-States und Texture-Stage-States weg. Dann sollte er die Textur zumindest anzeigen. Und dann denkst du nochmal darüber nach, was du eigentlich erreichen willst und was die einzelnen States bedeuten ...

NicoH

Treue Seele

  • »NicoH« ist der Autor dieses Themas

Beiträge: 89

Wohnort: Elsterwerda

Beruf: Student Informatik

  • Private Nachricht senden

8

30.05.2006, 20:37

ich habe das nur so eingetippt wie das im Buch steht, also ich habe die 6 zeilen mal netfernt... bzw auskommentiert und trotzdem kein bild gezeichnet, nur das schwarze vier eck
mfg NicoH

3 Wichtige Regeln des Programmierers:
- Nur in der Nacht programmieren
- Viel Kaffe und kalte Pizza im Vorrat haben (Cola geht auch ;))
- Keine Freundin (sie stört im wichtigsten Augenblick)

David Scherfgen

Administrator

Beiträge: 10 334

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

30.05.2006, 20:40

Zitat von »"NicoH"«

ich habe das nur so eingetippt wie das im Buch steht

Nein, hast du nicht.
Im gesamten Buch wird D3DTOP_PREMODULATE nie erwähnt.
Und nirgendwo wird D3DRS_ALPHATESTENABLE auf TRUE gesetzt, ohne danach auch die anderen Alpha-Testing-States zu setzen.
Ebenso werden nirgendwo D3DBLEND_SRCALPHA und D3DBLEND_INVDESTALPHA gemeinsam verwendet (weil es wenig Sinn macht).

Das kannst du mir glauben, denn ich besitze schließlich die PDFs vom Buch und habe diese gerade eben durchsucht.

Zitat von »"NicoH"«

oder muss ich dann noch die Streufarbe setzen?

Ja, natürlich. Du hast die Streufarbe der Vertizes nirgendwo angegeben, daher ist sie wahrscheinlich schwarz.

NicoH

Treue Seele

  • »NicoH« ist der Autor dieses Themas

Beiträge: 89

Wohnort: Elsterwerda

Beruf: Student Informatik

  • Private Nachricht senden

10

30.05.2006, 20:46

Ach du schande, stimmt, sorry (habe gerade die endungen verglichen :x ), was habe ich da wieder vom Visual Assist X eingeben lassen, okay , aber obwohl ich die zeilen entfernt habe , wird es nicht gezeichnet.
mfg NicoH

3 Wichtige Regeln des Programmierers:
- Nur in der Nacht programmieren
- Viel Kaffe und kalte Pizza im Vorrat haben (Cola geht auch ;))
- Keine Freundin (sie stört im wichtigsten Augenblick)

Werbeanzeige