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

11.09.2009, 13:36

DrawIndexedPrimitive Problem

Hallo,

ich bekomme einen schwarzen Bildschirm bei diesem Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    d3ddev->CreateVertexBuffer(numVert * sizeof(Vectoren), 0, CUSTOMFVF, D3DPOOL_DEFAULT, &vertexbuffer, 0);
    d3ddev->CreateIndexBuffer(numInd *2, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &indexbuffer, 0);

    void* pVertices;
    vertexbuffer->Lock(0, numVert * sizeof(Vectoren), (void**)&pVertices, 0);
    memcpy(pVertices, &Vectoren, sizeof(Vectoren));
    vertexbuffer->Unlock();

    void* pIndices;
    indexbuffer->Lock(0, 36*sizeof(WORD), reinterpret_cast<void**>(&pIndices), 0);
    memcpy(pIndices, &Gesichter, 36*sizeof(WORD));
    indexbuffer->Unlock();

    d3ddev->SetStreamSource(0, vertexbuffer, 0, sizeof(Vectoren));
    d3ddev->SetIndices(indexbuffer);
    d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, numVert * 8, 0, numVert * 12)
Aber warum? Alles ist gefüllt (also Vectoren, usw.).

Vielen Dank schon mal für euren Rat!

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

2

11.09.2009, 13:43

1.) welchen wert haben "Vectoren" und "Gesichter" ? kann sein das die drei-
ecke außerhalb der kamera sind oder sowas.

2.) matrizen richtig resetzt?

3.) shader? besondere renderstates?

mehr infos wären hier sehr hilfreich. um aber mal meine kristallkugel
zu benutzen, sage ich einfach mal: FVF nicht gesetzt?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

3

11.09.2009, 14:22

Zitat

1.) welchen wert haben "Vectoren" und "Gesichter" ? kann sein das die drei-
ecke außerhalb der kamera sind oder sowas.
Vectoren: x, y und z (float). Beispiel: 52,34 37,43 22,22
Gesichter: x1, x2, x3 (int). Beispiel: 3 6 9

Zitat

2.) matrizen richtig resetzt?
Jap.

Zitat

3.) shader? besondere renderstates?
FVF:

C-/C++-Quelltext

1
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)
Renderstates:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
        d3ddev->SetRenderState(D3DRS_LIGHTING, TRUE);
        d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE);
        d3ddev->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(50, 50, 50));

        d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
        d3ddev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
        d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
        d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

        d3ddev->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 16);
        d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
        d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);


P. S.: Gesichter und Vectoren sind Vectoren

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

11.09.2009, 14:37

godbread meint ist, dass du das FVF auch setzen musst:

C-/C++-Quelltext

1
d3ddev->SetFVF(CUSTOMFVF);

5

11.09.2009, 15:06

hab ich vergessen zu posten 8)
Hier noch meine Kamera:

C-/C++-Quelltext

1
2
3
4
5
6
        D3DXMATRIX matView;
        D3DXVECTOR3 position = D3DXVECTOR3(0.0f, 8.0f, 16.0f);
        D3DXVECTOR3 lookat = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
        D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
        D3DXMatrixLookAtLH(&matView, &position, &lookat, &up);
        d3ddev->SetTransform(D3DTS_VIEW, &matView);

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

6

11.09.2009, 15:45

mal die debug-runtime ausprobiert? (systemsteuerung->directX)
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

7

11.09.2009, 15:52

ich weiß nicht was du meinst, den bevor ich die Vertex- und Indexbuffer "aktiviert" habe, ging es und mir wurde (wie eingestellt) ein blauer DirectX Bildschirm angezeigt. Habe herausgefunden, dass der Fehler hier sein müsste:

C-/C++-Quelltext

1
d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, numVert * 8, 0, numVert * 12) 

8

11.09.2009, 19:23

Sorry wegen Doppelpoast, aber kann niemand mir helfen? Nochmal zusammengefasst: Bevor ich die DrawIndexedPrimitive-Funktion in mein Programm integriert habe, ging alles ohne Probleme und mir wurde alles angezeigt. Ich habe davor sogar noch überprüft ob Gesichter und Vectoren gefüllt ist. Seitdem ich nun die Funktion eingefügt habe, kompiliert Visual C++ ohne Fehlermeldung, aber sobald ich das Programm starte, bekomme ich einen schwarzen Bildschirm, den ich nur über den Taskmanager beenden kann. Visual C++ meldet mir dann in der oben genannten Zeile eine Fehlermeldung: "Unbehandelte Ausnahme bei 0x05d1c098 in test.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x05b3bfc0."

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

9

11.09.2009, 20:30

also.

in der CreateBuffer funktion gibst du

numvert * sizeof

an. warum * numvert? wenn "Vectoren" ein array ist, was ich vermute, ist
das überflüssig. bei memcpy kopierst du schließlich auch nur "sizeof(Vectoren)".

bei den indices kommt da auf einmal eine 36 dahergelaufen. magicnumbers
sollte man vllt vermeiden, mach dir dafür eine constante, zumal du die
byteangaben bei den funktionen einheitlich machen solltest.

sollte daran liegen, kann sein das du zuviel kopierst.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

10

11.09.2009, 21:18

Mich nervt das langsam ein bisschen. Jedes mal ein neuer Fehler (diesmal hab ich bei createbuffer das numVert * sizeof(...) weggelassen und stattdessen nur sizeof(..) gemacht, aber ich hab einen Programmfehler bekommen). Hier mal der ganze Code, vielleicht ist der Fehler woanders:

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
class FACES {
public:
    int verIndX, verIndY, verIndZ;
    int texIndX, texIndY, texIndZ;
} Face;
class VERTICES {
public:
    float x;
    float y;
    float z;
} Vector;
    std::ifstream Datei;
    Datei.open("C:/2.obj", std::ios::in);
    numVert = 0;
    numInd = 0;

    if(!Datei.good())
    {
    Datei.close();
    MessageBox(HWND_DESKTOP , "Datei konnte nicht geöffnet werden.", "Fehler", MB_OK | MB_ICONWARNING | MB_TASKMODAL);
    }

    std::vector<VERTICES> Vectoren;
    std::vector<FACES> Gesichter;
    while(!Datei.eof())
    {
        std::getline(Datei, Line);

        const std::string::size_type Koordinaten = Line.find("v"); 
        const std::string::size_type StrFace = Line.find("f");
        if(Koordinaten != std::string::npos)
        {
            Vector.x = NachFloat(Zeilen(Line, 1));
            Vector.y = NachFloat(Zeilen(Line, 2));
            Vector.z = NachFloat(Zeilen(Line, 3));

            Vectoren.push_back(Vector);
            numVert+= 3;
        }
        else if(StrFace != std::string::npos)
        {
            size_t x = Line.find("/");

            if(x == std::string::npos)
            {
                Face.verIndX = NachInt(Zeilen(Line, 1));
                Face.verIndY = NachInt(Zeilen(Line, 2));
                Face.verIndZ = NachInt(Zeilen(Line, 3));
                numInd++;

            } else if(x != std::string::npos)
            {
                Line.replace(Line.find("/"), 1, " ");
                Face.verIndX = NachInt(Zeilen(Line, 1));
                Face.texIndX = NachInt(Zeilen(Line, 2));

                Line.replace(Line.find("/"), 1, " ");
                Face.verIndY = NachInt(Zeilen(Line, 3));
                Face.texIndY = NachInt(Zeilen(Line, 4));

                Line.replace(Line.find("/"), 1, " ");
                Face.verIndZ = NachInt(Zeilen(Line, 5));
                Face.texIndZ = NachInt(Zeilen(Line, 6));

                Gesichter.push_back(Face);
                numInd++;
            }

        }

    }

    Datei.clear();

// DirectX

d3d = Direct3DCreate9(D3D_SDK_VERSION);
        D3DPRESENT_PARAMETERS d3dpp;

        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.Windowed = FALSE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow = hwnd;
        d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
        d3dpp.BackBufferWidth = fnk_Width(0, 'n');
        d3dpp.BackBufferHeight = fnk_Height(0, 'n');
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

        d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);

        d3ddev->SetRenderState(D3DRS_LIGHTING, TRUE);
        d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE);
        d3ddev->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(50, 50, 50));

        d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
        d3ddev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
        d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
        d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

        d3ddev->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 16);
        d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
        d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        d3ddev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(120, 120, 0), 1.0f, 0);
        d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
        d3ddev->BeginScene();
        d3ddev->SetFVF(CUSTOMFVF);

        D3DXMATRIX matView;
        D3DXVECTOR3 position = D3DXVECTOR3(0.0f, 8.0f, 16.0f);
        D3DXVECTOR3 lookat = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
        D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
        D3DXMatrixLookAtLH(&matView, &position, &lookat, &up);
        d3ddev->SetTransform(D3DTS_VIEW, &matView);
    
    d3ddev->CreateVertexBuffer(numVert * sizeof(Vectoren), 0, CUSTOMFVF, D3DPOOL_DEFAULT, &vertexbuffer, 0);
    d3ddev->CreateIndexBuffer(sizeof(Gesichter), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &indexbuffer, 0);

    void* pVertices;
    vertexbuffer->Lock(0, /*numVert * */sizeof(Vectoren), (void**)&pVertices, 0);
    memcpy(pVertices, &Vectoren, sizeof(Vectoren));
    vertexbuffer->Unlock();

    void* pIndices;
    indexbuffer->Lock(0, sizeof(Gesichter), reinterpret_cast<void**>(&pIndices), 0);
    memcpy(pIndices, &Gesichter, sizeof(Gesichter));
    indexbuffer->Unlock(); 

    d3ddev->SetStreamSource(0, vertexbuffer, 0, sizeof(Vectoren));
    d3ddev->SetIndices(indexbuffer);
    if(FAILED(d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, numVert * 8, 0, numVert * 12)))
    {
        MessageBox(HWND_DESKTOP , "Vertex konnte nicht gezeichnet werden.", "Fehler", MB_OK | MB_ICONWARNING | MB_TASKMODAL);
    }
d3ddev->EndScene();
        d3ddev->Present(NULL, NULL, NULL, NULL);

Werbeanzeige