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

16.06.2008, 22:42

Vertex und IndexBuffer Beispiel Fehler

Hi
ich habe das Vertex und INdexBuffer Beispiel etwas abgeändert neu geschrieben. die Würfel drehen sich im moment nur um die kamera herum und die ist nicht beweglich. Jedenfalls sollte das so sein ;) leider werden meine Würfel nicht angezeigt. Ich versuch nun schon seit 2 stunden mit dem buch und dem beispielprog den Fehler zu finden, aber leider finde ich ihn nicht. Kann mir eventuell jemand sagen, was ich falsch mache?

Hier ist 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
#include <TriBase.h>
#include "..\\..\\Allgemeines\\InitWindow.h"
#include "..\\..\\Allgemeines\\Direct3DEnum.h"
#include "..\\..\\Allgemeines\\InitDirect3D.h"
#include "..\\..\\Allgemeines\\Allgemeines.h"

struct SVertex
{
    tbVector3 vPosition;
    DWORD Color;
    static const DWORD  dwFVF;
};

const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

SDirect3DParameters g_D3DParams;

PDIRECT3DVERTEXBUFFER9 g_pVertexBuffer;
PDIRECT3DINDEXBUFFER9 g_pIndexBuffer;
LPDIRECT3DTEXTURE9 Texture;

const int g_iNumCubes = 2048;
const int g_iNumVertices = g_iNumCubes * 8;

SVertex pVertices[g_iNumVertices];
unsigned short *pIndices;

float g_fTime = 0.0f;

tbResult Render(float fNumSecsPassed)
{
    tbMatrix mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f));
    tbMatrix mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(90.0f * g_fTime));
    tbMatrix mWorld = tbMatrix(mRotation *  mTranslation);

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

    tbMatrix mCamera = tbMatrixIdentity();

    g_pD3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)(&mCamera));

    g_pD3DDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0),
        1.0f, 0);

    g_pD3DDevice->BeginScene();

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

    g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0,
        g_iNumCubes * 8,
        0,
        g_iNumCubes * 12);

    g_pD3DDevice->EndScene();

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

    return TB_OK;
}

tbResult Move(float fNumSecsPassed)
{
    if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
    {
        PostQuitMessage(0);
    }
    g_fTime += fNumSecsPassed;
    return TB_OK;
}

void InitScene()
{
    const float fAspect = (float)(g_D3DParams.VideoMode.Width) / 
        (float)(g_D3DParams.VideoMode.Height);
    tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f), fAspect,
        0.1f, 250.0f);

    g_pD3DDevice->SetFVF(SVertex::dwFVF);

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

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

    g_pD3DDevice->CreateVertexBuffer(g_iNumCubes * 8 * sizeof(SVertex), 
        0,SVertex::dwFVF, D3DPOOL_MANAGED, &g_pVertexBuffer, 0);

    g_pD3DDevice->CreateIndexBuffer(g_iNumCubes * 36 * 2, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED,
        &g_pIndexBuffer, 0);

    g_pVertexBuffer->Lock(0,0,(void**)(&pVertices), D3DLOCK_NOSYSLOCK);
    g_pIndexBuffer->Lock(0,0,(void**)(&pIndices), D3DLOCK_NOSYSLOCK);

    for(int iCubes = 0; iCubes < g_iNumCubes; iCubes++)
    {
        tbVector3 vCube = tbVector3Random() * tbFloatRandom(20.0f, 250.0f);

        int iStartVertex = iCubes * 8;
        int iStartIndex = iCubes * 36;

        pVertices[iStartVertex + 0].vPosition = vCube + tbVector3(-1.0f, 1.0f, -1.0f);
        pVertices[iStartVertex + 1].vPosition = vCube + tbVector3(-1.0f, 1.0f, 1.0f);
        pVertices[iStartVertex + 2].vPosition = vCube + tbVector3(1.0f, 1.0f, 1.0f);
        pVertices[iStartVertex + 3].vPosition = vCube + tbVector3(1.0f, 1.0f, -1.0f);
        pVertices[iStartVertex + 4].vPosition = vCube + tbVector3(-1.0f, -1.0f, -1.0f);
        pVertices[iStartVertex + 5].vPosition = vCube + tbVector3(-1.0f, -1.0f, 1.0f);
        pVertices[iStartVertex + 6].vPosition = vCube + tbVector3(1.0f, -1.0f, 1.0f);
        pVertices[iStartVertex + 7].vPosition = vCube + tbVector3(1.0f, -1.0f, -1.0f);

        for(int iVertex = iStartVertex; iVertex < iStartVertex + 8; iVertex++)
        {
            pVertices[iVertex].Color = tbColor(1.0f, 0.0f, 0.0f);
        }

        int aiIndex[36] = { 0,3,7, 0,7,4,
                            2,1,5, 2,5,6,
                            1,0,4, 1,4,5,
                            3,2,6, 3,6,7,
                            0,1,2, 0,2,3,
                            6,5,4, 6,4,7};

        for(int iIndex = 0; iIndex < 36; iIndex++)
        {
            pIndices[iStartIndex + iIndex] = aiIndex[iIndex] + iStartVertex;
        }
    }

    g_pIndexBuffer->Unlock();
    g_pVertexBuffer->Unlock();
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR CmdLine, int ShowCmd)
{
    tbInit();
    GetDirect3DParameters(&g_D3DParams);
    InitWindow(g_D3DParams.VideoMode.Width, g_D3DParams.VideoMode.Height,
        "Vertex und IndexBuffer", LoadIcon(NULL, IDI_APPLICATION));
    InitDirect3D(&g_D3DParams, g_hWindow);
    InitScene();
    tbDoMessageLoop(Render, Move);
    ExitDirect3D();
    ExitWindow();
    tbExit();
    return 0;
}


Schonmal danke im Voraus =)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

16.06.2008, 23:04

Hast du den Debug Output schon mal angeschaut?

Start->Ausführen->dxcpl Dann auf "Use Debug Version of Direct3D 9" und mal schauen, was er dann so meint, wenn du debugst.. ;)

Ansonsten Schau mal die Positionen an, ob die stimmen.

3

16.06.2008, 23:29

hmm. dxcpl hab ich nich gefunden... ich hab die positionen nochmal überprüft, die müssten stimmen. Im BuildLog von VC++ stand auch keine Warnung, ausser das die exe noch nicht existiert hat beim kompilieren. Ich habe auch nochmal ein paar Fehlerabfragen eingebaut doch die melden mir auch nichts. Naja trotzdem danke :)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

16.06.2008, 23:39

Hmm. Hast du das DirectX SDK nicht installiert? (Control Panel wäre das).

Das hilft dir jetzt wahrscheinlich nix,aber warum hast du da ein Array?

C-/C++-Quelltext

1
SVertex pVertices[g_iNumVertices]; 


Das ist gar nicht nötig.

C-/C++-Quelltext

1
    g_pVertexBuffer->Lock(0,0,(void**)(&pVertices), D3DLOCK_NOSYSLOCK); 


Hier geht das ganze ja eh wieder verloren. Du brauchst lediglich den Zeiger. Das Array ist unnötig.

5

16.06.2008, 23:49

ich glaubs nich^^ du sagst sogar noch das bringt eh nix und schon werden meine tolen roten würfel gerendert :D Danke!!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

17.06.2008, 00:04

Zitat von »"Mr. Data"«

ich glaubs nich^^ du sagst sogar noch das bringt eh nix und schon werden meine tolen roten würfel gerendert :D Danke!!


:)
np

Werbeanzeige