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

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

1

06.05.2004, 11:34

Problemm mit dem Rendern eines Gitters

So,

Jetzt kommt mal wieder so ein Hammer von mir *gg*. Das Problem ist sowohl Vertex als auch Indexdaten stimmen aber es wird im Programm nichts auser einer Linie angezeigt.

Das ist der Initialisierungscode:



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
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
//-----------------------------------------------------------------------------------------------------------------
// Initialisiert ein Objekt
void c_eglWaterSurface::Initialize(char* cpObjectName,int nResolution,int nSize)
{
    // Logeintrag machen
    Log.Log(__FILE__,__LINE__,"Ein Watersurface Objekt wird initialisiert .... ");

    HRESULT hResult; // lokale Ergebnisvariable
    
    // Objektauflösung sowie Vertex und Dreiecksanzahl berechnen und speichern
    this->m_nResolution = nResolution;
    this->m_nVertices   = nResolution * nResolution;
    this->m_nTriangles  = ((nResolution - 1) * (nResolution -1)) * 2;
    this->m_nIndices    = this->m_nTriangles * 3;

    // Array erstellen indem die Indexes gespeichert werden können
    unsigned short* ausIndexes = new unsigned short[this->m_nIndices];

    // Indexedaten erstellen
    int nIndexCount = 0;
    
    // X Reihe des Gitters durchgehen
    for(int x = 0; x < nResolution - 1; x++) {
        
        // Y Reihe des Gitters durchgehen
        for(int y = 0; y < nResolution - 1; y++) {
            
            // Erster Index
            ausIndexes[nIndexCount] = this->GetIndexFromXY(x,y);
            nIndexCount += 1;
            // Zweiter Index
            ausIndexes[nIndexCount] = this->GetIndexFromXY(x + 1,y);
            nIndexCount += 1;
            // Dritter Index
            ausIndexes[nIndexCount] = this->GetIndexFromXY(x,y + 1);
            nIndexCount += 1;

            // Vierter Index
            ausIndexes[nIndexCount] = this->GetIndexFromXY(x + 1,y);
            nIndexCount += 1;
            // Fünfter Index
            ausIndexes[nIndexCount] = this->GetIndexFromXY(x + 1,y + 1);
            nIndexCount += 1;
            // Sechster Index
            ausIndexes[nIndexCount] = this->GetIndexFromXY(x,y + 1);
            nIndexCount += 1;
        }
    }

    // Indexbuffer erstellen
    if(FAILED(hResult = g_pD3DD->CreateIndexBuffer(this->m_nIndices * sizeof(unsigned short),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&this->m_pIB))) {
        // Fehler !
        Log.DirectXError(__FILE__,__LINE__,hResult,"Fehler beim erstellen des Indexbuffers für ein Wasseroberflächenobjekt -> Objektname: %s", cpObjectName);
        return;
    }

    // Indexbuffer Sperren und Daten hineinkopieren
    void *pIndexData;
    if(FAILED(hResult = this->m_pIB->Lock(0,this->m_nIndices * sizeof(unsigned short),(BYTE**)&pIndexData,0))) {
        // Fehler !
        Log.DirectXError(__FILE__,__LINE__,hResult,"Fehler beim sperren des Indexbuffer eines Wasseroberflächenobjekt -> Objektname: %s",cpObjectName);
        return;
    }

    // Erste 6 Indexes Loggen
    Log.Log(__FILE__,__LINE__,"Index1: %d",ausIndexes[0]);
    Log.Log(__FILE__,__LINE__,"Index2: %d",ausIndexes[1]);
    Log.Log(__FILE__,__LINE__,"Index3: %d",ausIndexes[2]);
    Log.Log(__FILE__,__LINE__,"Index4: %d",ausIndexes[3]);
    Log.Log(__FILE__,__LINE__,"Index5: %d",ausIndexes[4]);
    Log.Log(__FILE__,__LINE__,"Index6: %d",ausIndexes[5]);

    // Daten hineinkopieren
    memcpy(pIndexData,ausIndexes,sizeof(ausIndexes));

    // Indexbuffer entsperren
    this->m_pIB->Unlock();
    
    // Temporäre index Daten löschen
    delete[] ausIndexes;

    // Array mit Vertexdaten anlegen
    s_eglWaterVertex* sVertices = new s_eglWaterVertex[this->m_nVertices];

    // Vertexdaten erstellen
    int nVertexCount    = 0;
    float fSquareStep   = (float)nSize / (float)nResolution;
    float fActStepX     = 0.0f;
    float fActStepY     = 0.0f - ((float)nResolution / 2.0f) * fSquareStep;
    
    // Variablen Loggen
    Log.Log(__FILE__,__LINE__,"SquareStep =  %f, ActStepX = %f, ActStepY = %f, VertexCount = %d",fSquareStep,fActStepX,fActStepY,nVertexCount); 

    // X Reihe des Gitter durchgehen
    for(int y = 0; y < nResolution - 1; y++) {
        // Auf Anfangswert zurücksetzen
        fActStepX = 0 - ((float)nResolution / 2.0f) * fSquareStep;
        // Y Reihe des Gitters durchgehen
        for(int x = 0; x < nResolution; x++) {
    
            // Erster Vertex
            sVertices[nVertexCount].vecPosition = D3DXVECTOR3(fActStepX,0.0f,fActStepY);
            sVertices[nVertexCount].dwColor     = D3DCOLOR_XRGB(  0,  0,255);

            // Step und Vertexzähler erhöhen
            fActStepX       += fSquareStep;
            nVertexCount    += 1;
        }

        // Y Step erhöhen
        fActStepY += fSquareStep;
    }

    // Vertexbuffer erstellen
    if(FAILED(hResult = g_pD3DD->CreateVertexBuffer(4 * sizeof(s_eglWaterVertex),D3DUSAGE_WRITEONLY,D3DFVF_XYZ | D3DFVF_DIFFUSE,D3DPOOL_DEFAULT,&this->m_pVB))) {
        // Fehler !
        Log.DirectXError(__FILE__,__LINE__,hResult,"Fehler beim  erstellen des Vertexbuffers für ein Wasseroberflächenobjekt -> Objektname: %s",cpObjectName);
        return;
    }
    
    // Vertexbuffer sperren
    void* pVertexData;
    if(FAILED(hResult = this->m_pVB->Lock(0,this->m_nVertices * sizeof(s_eglWaterVertex),(BYTE**)&pVertexData,0))) {
        // Fehler !
        Log.DirectXError(__FILE__,__LINE__,hResult,"Fehler beim sperren des Vertexbuffers eines Wasseroberflächenobjekts -> Objektname %s",cpObjectName);
        return;
    }
    // Logeinträge

    // Daten hineinkopieren
    memcpy(pVertexData,sVertices,sizeof(sVertices));

    // Vertexbuffer entsperren
    this->m_pVB->Unlock();

    // Temporäre Vertexdaten löschen
    delete[] sVertices;

    // Eingenschaften speichern und Status ändern
    this->m_cpObjectName = cpObjectName;
    this->m_bInitialized = TRUE;

    // Logentrag machen
    Log.Log(__FILE__,__LINE__,"Das Wasseroberflächenobjekt: %s mit einer Auflösung von: %d und einer Große von: %d wurde <b>erfolgreich</b> initialisiert",cpObjectName,nResolution,nSize);
}



So und das ist der Rendercode

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
//-----------------------------------------------------------------------------------------------------------------
// Render das Wasseroberflächen Objekt
void c_eglWaterSurface::Render(void)
{
    // Prüfen ob das Objekt initialisiert ist wenn ja Rendern ansonsten Funktion abbrechen
    if(IsInitialized() == FALSE) { return; }

    HRESULT hResult;    // lokale Ergebnissvariable

    // Aktuelle Renderstates speichern
    DWORD dwRenderstates[10];
    g_pD3DD->GetRenderState(D3DRS_LIGHTING,&dwRenderstates[0]);
    
    // Neue Renderstates setzen
    g_pD3DD->SetRenderState(D3DRS_LIGHTING,FALSE);
    g_pD3DD->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);

    // Vertexquelle ( Stream ) setzen
    g_pD3DD->SetStreamSource(0,this->m_pVB,sizeof(s_eglWaterVertex));

    // Indexes setzen
    g_pD3DD->SetIndices(this->m_pIB,0);
    
    // Texturen setzen
    g_pD3DD->SetTexture(0,NULL);

    // VertexShader setzen
    g_pD3DD->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE);

    // Transformation setzen
    D3DXMATRIX matWorld;
    D3DXMatrixIdentity(&matWorld);
    g_pD3DD->SetTransform(D3DTS_WORLD,&matWorld);
    
    // Objekt zeichnen
    if(FAILED(hResult = g_pD3DD->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,this->m_nVertices,0,this->m_nTriangles))) {
        // Fehler !
        Log.DirectXError(__FILE__,__LINE__,hResult,"Fehler beim zeichnen eines Wasseroberflachen Objekts");
    }

    // Alte Renderstates wieder herstellen
    g_pD3DD->SetRenderState(D3DRS_LIGHTING,dwRenderstates[0]);
    g_pD3DD->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
}



Ich hab keine Ahnung warum er mir kein Gitter darstellt.
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

06.05.2004, 14:30

Also ich habe es mal überflogen und mich gefragt wie die "this->GetIndexFromXY(x,y);"-Funktion aussieht.
Ist es beabsichtigt nur 4 Vertex zu erzeugen?
"g_pD3DD->SetIndices(this->m_pIB,0);" eigentlich müsste es doch lauten:"g_pD3DD->SetIndices(this->m_pIB);"
Ich hoffe da ist nen Treffer dabei.

Anonymous

unregistriert

3

06.05.2004, 15:43

Hallo

Em die Funktion sieht so aus:

Quellcode

1
return y * this->m_nResultion + x


Was du mit den 4 Vertices meinst check ich nicht ganz.

Das

Quellcode

1
g_pD3DD->SetIndices[this->m_pIB,0); 


ist so schon korrekt da ich mit DirectX 8 arbeite und man da den Basisvertex angeben. :roll:

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

06.05.2004, 16:09

g_pD3DD->CreateVertexBuffer(4 * sizeof(s_eglWaterVertex),D3DUSAGE_WRITEONLY,D3DFVF_XYZ | D3DFVF_DIFFUSE,D3DPOOL_DEFAULT,&this->m_pVB)
sind nur 4 Verticies.

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

5

06.05.2004, 17:11

Jo stimmt das war ein fehler

Aber daran lag es nicht es hat mich aber auf eine Idee gebracht und zwar könnte es eventuell etwas mit dem Füllen der Buffer zu tuhen haben denn die Daten sind korekt. Und zweitens müsste meine Engine doch abstürzen wenn ich versuche per memcpy einen größeren Speicherbereich in den Zielspeicherbereich zu kopieren. Könnte vieleicht mal jemand da ein Blick drauf werfen ?
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

6

06.05.2004, 17:21

Jetzt gehts

Die größe hat einfach nciht gestimmt den Sizeof

sVertices ist nur die Große des Speicherbereichs welche der zweiger belegt aber nicht die dessen welche die Vertexes belegen
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

06.05.2004, 20:51

Und funzt es jetzt?

MannyDasMammut

Treue Seele

  • »MannyDasMammut« ist der Autor dieses Themas

Beiträge: 76

Wohnort: Baden - Würtemberg / Achern

Beruf: Schüler

  • Private Nachricht senden

8

06.05.2004, 20:53

Ja läuft

Jop funk 1 a Spitzenklasse :huhu: :wirbel: :wirbel: :wirbel: :wirbel:
Werde ich hier eigentlich noch gebrauch ansonsten würd ich gerne nach Hause gehen und meine graue Wand anstarren.

Werbeanzeige