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

Chris14465

Frischling

  • »Chris14465« ist der Autor dieses Themas

Beiträge: 44

Wohnort: Nähe Siegburg bei Köln

Beruf: Schüler

  • Private Nachricht senden

1

25.08.2007, 18:51

Index Buffer + Vertex Buffer

Hey Leute,
ich hab eine Frage zu den Index und Vertexbuffern...
Ich frage mich, warum man in dem Beispielprogramm ein Index und ein Vertexbuffer braucht, ich hab das nämlich so verstanden,
dass das nur zwei verschiedene Methoden sind wie man da aufem Grafikspeicher speichern kann und das mit dem Index spart halt Performance wenn man z.B. einen Würfel zeichnen will.
Ich hoffe mir kann einer Klarheit schaffen :badgrin:
Gruß: Chris14465

2

25.08.2007, 18:54

Nee ... nicht richtig verstanden ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Chris14465

Frischling

  • »Chris14465« ist der Autor dieses Themas

Beiträge: 44

Wohnort: Nähe Siegburg bei Köln

Beruf: Schüler

  • Private Nachricht senden

3

25.08.2007, 18:59

Öhm joa, soll ichs nun nochmal lesen (ist schon das 2te mal) oder willst dus mir vieleicht mal kurz erklären? :?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

25.08.2007, 19:03

Den Indexpuffer brauchst du um auf verschiedene Vertice zuzugreifen. Das hat den Vorteil das du die Vertexreihenfolge total Variabel sein kann und du Vertice doppelt verwenden kannst ohne gleich den doppelten Speicher zu verbraten. Aber ein Indexpuffer nutzt nur in zusammenspiel mit einem Vertexpuffer etwas, ein Vertexpuffer kann man auch gesondert verwenden.
@D13_Dreinig

Chris14465

Frischling

  • »Chris14465« ist der Autor dieses Themas

Beiträge: 44

Wohnort: Nähe Siegburg bei Köln

Beruf: Schüler

  • Private Nachricht senden

5

25.08.2007, 19:04

Ok, erstmal danke.
Kann man also einen Index Buffer nutzen, wenn man so Sachen darstellen will, wo man für einen Punkt mehrere Dreiecke benutzen müsste?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

25.08.2007, 19:06

Hä? Was? :-| Du kannst per Indexpuffer Vertice geteilt verwenden, falls du das meinst.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

25.08.2007, 20:27

Zitat von »"Chris14465"«

Kann man also einen Index Buffer nutzen, wenn man so Sachen darstellen will, wo man für einen Punkt mehrere Dreiecke benutzen müsste?


ich denk, so wie du das gemeint hast, hast du recht^^

Chris14465

Frischling

  • »Chris14465« ist der Autor dieses Themas

Beiträge: 44

Wohnort: Nähe Siegburg bei Köln

Beruf: Schüler

  • Private Nachricht senden

8

25.08.2007, 21:33

So, ich hab mir jetzt mal versucht ein einzigen Würfel "zusammenzuschnippseln" , allerdings kriege ich nur ein schwarzen Bildschirm.
Mein Code:

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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#include <d3dx9.h>
#include <D3D9.h>
#include <TriBase.h>

#define TRIANGLE_FVF ( D3DFVF_XYZ | D3DFVF_DIFFUSE )

struct SVertex
{
    tbVector3            vPosition;    // Position des Vertex

    D3DCOLOR            Color;        // Farbe des Vertex

    static const DWORD  dwFVF;      // Vertexformat

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

float                g_fTime = 0.0f;            // Zeitzähler

tbDirect3D& D3D = tbDirect3D::Instance();
SVertex             g_aVertex[8];
PDIRECT3DVERTEXBUFFER9  g_pVertexBuffer = NULL;         // Vertex-Buffer

PDIRECT3DINDEXBUFFER9   g_pIndexBuffer = NULL;          // Index-Buffer

tbConfig g_Config;


// Move-Funktion

tbResult Move(float fTime)
{
  

    return TB_OK;
}


// Render-Funktion

tbResult Render(float fTime)
{
    HRESULT        hResult;
    tbMatrix    mWorld;            // Weltmatrix

    tbMatrix    mTranslation;    // Translationsmatrix


if(FAILED(hResult = D3D->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 0),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!

        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    
    D3D->BeginScene();
   
    // ------------------------------------------------------------------

    // Rotations- und Translationsmatrix des Dreiecks erzeugen

    mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f));
   
    // Beide Matrizen kombinieren und als Weltmatrix einsetzen

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

    // Alle Würfel auf einmal zeichnen.

    // Zuerst den Vertex- und den Index-Buffer als Datenquelle aktivieren.

    D3D->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(SVertex));
    D3D->SetIndices(g_pIndexBuffer);

    // Zeichnen!

    hResult = D3D->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, // Dreiecksliste

                                                 0,                     // Basisvertexindex

                                                 0,                     // Der kleinste Index

                                                 1 * 8,     // Diff. zw. größtem u. kleinstem Index

                                                 0,                     // Von Anfang an zeichnen

                                                 1 * 12);       // 12 Dreiecke pro Würfel

    if(FAILED(hResult))
    {
        // Fehler beim Zeichnen!

        TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitive", hResult, TB_STOP);
    }

    // Szene beenden

    D3D->EndScene();

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

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


    return TB_OK;
}


tbResult InitGame(char *WindowTitle)
{
    HRESULT hResult;
    tbResult r;
    SVertex*        pVertices;
    unsigned short* pusIndices;
    int             iStartVertex;
    int             iStartIndex;
    iStartVertex = 1*8;
    iStartIndex = 1*36;
    // Die TriBase-Engine initialisieren und den Konfigurationsdialog aufrufen

    if(tbInit()) return TB_ERROR;
    r = tbDoConfigDialog(&g_Config);
    if(r == TB_CANCELED) return TB_CANCELED;
    else if(r) TB_ERROR("Engine konnte nicht initialisiert werden!", r);

    if (tbDirect3D::Instance().Init(&g_Config, WindowTitle, NULL, NULL))
    {
        TB_ERROR("Direct3D konnte nicht initialisiert werden.", TB_ERROR);
    }
   
   
    D3D->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    D3D->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    D3D->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

    // Beleuchtung und Culling ausschalten, Dithering aktivieren

    D3D->SetRenderState(D3DRS_LIGHTING, FALSE);
    D3D->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    D3D->SetRenderState(D3DRS_DITHERENABLE, TRUE);

    // Das Bildseitenverhältnis berechnen

    float fAspect =   (float)(D3D.GetScreenSize().x)/ (float)(D3D.GetScreenSize().y);

    // Die Projektionsmatrix erzeugen

    tbMatrix 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

    D3D->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
    if(FAILED(hResult = D3D->CreateVertexBuffer(1 * 8 * sizeof(SVertex),
                                                         0,
                                                         SVertex::dwFVF,
                                                         D3DPOOL_MANAGED,
                                                         &g_pVertexBuffer,
                                                         NULL)))
    {
        // Fehler beim Erstellen des Vertex-Buffers!

        TB_ERROR_DIRECTX("g_pD3DDevice->CreateVertexBuffer", hResult, TB_ERROR);
    }
    if(FAILED(hResult = D3D->CreateIndexBuffer(1 * 36 * 2,
                                                        0,
                                                        D3DFMT_INDEX16,
                                                        D3DPOOL_MANAGED,
                                                        &g_pIndexBuffer,
                                                        NULL)))
    {
        // Fehler beim Erstellen des Index-Buffers!

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

    // Vertex- und Index-Buffer komplett sperren

    g_pVertexBuffer->Lock(0, 0, (void**)(&pVertices), D3DLOCK_NOSYSLOCK);
    g_pIndexBuffer->Lock(0, 0, (void**)(&pusIndices), D3DLOCK_NOSYSLOCK);
    
    g_aVertex[0].vPosition = tbVector3(-1.0f,  1.0f, -1.0f);
    g_aVertex[1].vPosition = tbVector3(-1.0f,  1.0f,  1.0f);
    g_aVertex[2].vPosition = tbVector3( 1.0f,  1.0f,  1.0f);
    g_aVertex[3].vPosition = tbVector3( 1.0f,  1.0f, -1.0f);
    g_aVertex[4].vPosition = tbVector3(-1.0f, -1.0f, -1.0f);
    g_aVertex[5].vPosition = tbVector3(-1.0f, -1.0f,  1.0f);
    g_aVertex[6].vPosition = tbVector3( 1.0f, -1.0f,  1.0f);
    g_aVertex[7].vPosition = tbVector3( 1.0f, -1.0f, -1.0f);
    for(int i=0; i < 8; i++)
    {
        g_aVertex[i].Color = tbColor(1.0f, 1.0f, 1.0f);
    }

    // Nun die Indizes eintragen. Jeweils drei von ihnen ergeben ein Dreieck.

    int aiIndex[36] = {0, 3, 7,   0, 7, 4,  // Vorderseite

                       2, 1, 5,   2, 5, 6,  // Hinterseite

                       1, 0, 4,   1, 4, 5,  // Linke Seite

                       3, 2, 6,   3, 6, 7,  // Rechte Seite

                       0, 1, 2,   0, 2, 3,  // Oberseite

                       6, 5, 4,   6, 4, 7}; // Unterseite

    // Die 36 Indizes in den Index-Buffer übertragen.

    // Zu jedem Indexwert muss noch der Startvertexwert addiert werden.

    for(int iIndex = 0; iIndex < 36; iIndex++)
    {
        // Index eintragen

        pusIndices[iStartIndex + iIndex] = aiIndex[iIndex] + iStartVertex;
    }
    // Vertex- und Index-Buffer wieder entsperren

    g_pVertexBuffer->Unlock();
    g_pIndexBuffer->Unlock();
    return TB_OK;

}



tbResult RunGame(void)
{

    if(tbDoMessageLoop(&Move, &Render))
    {
        TB_ERROR("Fehler in der Nachrichtenschleife.", TB_ERROR);
    }   

    return TB_OK;

}


tbResult ExitGame(void)
{

    tbDirect3D::Instance().Exit();

    if(tbExit())
    {
        TB_ERROR("Fehler beim beenden der TriBase Engine.", TB_ERROR);
    }   

    return TB_OK;

}



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pcCpmmandLine, int iShowCommand)
{
    InitGame("Test");

    RunGame();

    ExitGame();

    return 0;

} 


Hat jemand eine Ahung?
Danke im Voraus!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

26.08.2007, 11:16

erstmal wenn du die Puffer sperrst solltest du die größe Ruhig angeben (Statt Lock(0,0,...) Lock(0,36*sizeof(WORD),...) bei IndexBuffer).
pusIndices muss von Typ Word sein, weil du ja als format 16-Bit Indices angegeben hast.
Dann machts du dir das mit dem Übertragen viel zu kompliziert. nutze doch einfach Memcpy!

C-/C++-Quelltext

1
  memcpy(pusIndices,aiIndex,36*sizeof(WORD));


Achso und ich hab ja nie mit Tribase gearbeiet deswegen weis ich nicht mit welcher Farbtiefe da gearbeitet wird (arbeite an eigener Engine). Wenns aber mehr als 256 farben sind kannste dir Dithering sparen.

Chris14465

Frischling

  • »Chris14465« ist der Autor dieses Themas

Beiträge: 44

Wohnort: Nähe Siegburg bei Köln

Beruf: Schüler

  • Private Nachricht senden

10

26.08.2007, 11:31

Mmh, leider immernoch schwarzer Bildschirm...

Werbeanzeige