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

07.02.2012, 00:59

Viereck rendern mit Tribase-Engine

Hallo zusammen! Nachdem ich jetzt schon seit Stunden vergeblich versuche, ein Viereck (aus Index- und Vertexpuffern) zu rendern und es einfach nicht gebacken kriege, frage ich einfach mal hier nach. Eigentlich sollte das ja nicht weiter schwer sein, und das Rendern komplexerer Modelle etc. habe ich auch schon längst hinbekommen...aber bei diesem blöden Viereck bin ich mit meinem Latein jetzt wirklich am Ende und weiß beim besten Willen nicht, wo da der Fehler sein soll. Der Bildschirm bleibt einfach schwarz und auch durch Verändern von Kameraposition und -blickwinkel kann ich kein Viereck entdecken. Wahrscheinlich habe ich also doch irgendwo etwas vergessen oder falsch gemacht, auch wenn ich eigentlich der Meinung bin, an alles gedacht zu haben und mittlerweile wirklich alles Erdenkliche ausprobiert haben müsste.

Hier mal der Code (nicht über die Hässlichkeit wundern, das ist aus diversen Beispielen zusammenkopiert ;)):

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
tbResult CGame::Render(float fTime)
{
    tbMatrix    mCamera;
    tbMatrix    mProjection;
    tbVector3   vCameraPos;
    tbVector3   vCameraLookAt;
    DWORD       dwNumVectors;
    D3DLIGHT9   CamLight;
    PDIRECT3DVERTEXBUFFER9  pVertexBuffer = NULL;
    PDIRECT3DINDEXBUFFER9   pIndexBuffer = NULL;
    SVertex*                pVertices;
    unsigned short*         pusIndices;
    PDIRECT3DTEXTURE9       pTexture = NULL;    


    // Puffer leeren und Szene beginnen
    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    D3D->BeginScene();

    //Kamera
    vCameraPos = tbVector3(0.0f, 2.0f, -1.0f);
    vCameraLookAt = tbVector3(0.0f, 0.0f, 0.0f);
    mCamera = tbMatrixCamera(vCameraPos, vCameraLookAt);
    D3D.SetTransform(D3DTS_VIEW, mCamera);

    // Projektionsmatrix erstellen und aktivieren
    mProjection = tbMatrixProjection(TB_DEG_TO_RAD(70.0f), D3D.GetAspect(), 0.1f, 50.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);
    
    // Richtungslicht mit der Richtung der Kamera erstellen und aktivieren
    ZeroMemory(&CamLight, sizeof(D3DLIGHT9));
    CamLight.Type = D3DLIGHT_DIRECTIONAL;
    CamLight.Diffuse = tbColor(1.0f, 1.0f, 1.0f);
    CamLight.Specular = tbColor(1.0f, 1.0f, 1.0f);
    CamLight.Direction = vCameraLookAt - vCameraPos;
    D3D->SetLight(0, &CamLight);
    D3D->LightEnable(0, TRUE);

    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());

    //Vertexbuffer
    D3D->CreateVertexBuffer(4 * sizeof(SVertex),
                                                        0,
                                                         SVertex::dwFVF,
                                                         D3DPOOL_MANAGED,
                                                         &pVertexBuffer,
                                                         NULL);

    //Indexbuffer
    D3D->CreateIndexBuffer(6,
                                    0,
                                     D3DFMT_INDEX16,
                                     D3DPOOL_MANAGED,
                                     &pIndexBuffer,
                                     NULL);

    pVertexBuffer->Lock(0, 0, (void**)(&pVertices), D3DLOCK_NOSYSLOCK);
    pIndexBuffer->Lock(0, 0, (void**)(&pusIndices), D3DLOCK_NOSYSLOCK);

    pVertices[0].vPosition = tbVector3(1.0f, 0.0f, 1.0f);
    pVertices[1].vPosition = tbVector3(3.0f, 0.0f, 1.0f);
    pVertices[2].vPosition = tbVector3(3.0f, 0.0f, 3.0f);
    pVertices[3].vPosition = tbVector3(1.0f, 0.0f, 3.0f);

    pVertices[0].vTexture = tbVector2(0.0f, 1.0f);
    pVertices[1].vTexture = tbVector2(1.0f, 0.0f);
    pVertices[2].vTexture = tbVector2(1.0f, 1.0f);
    pVertices[3].vTexture = tbVector2(0.0f, 1.0f);


    for(int iVertex = 0; iVertex < 4; iVertex++)
        {
            pVertices[iVertex].dwColor = tbColor(1.0f, 0.5f ,1.0f ,1.0f);
        }

    int aiIndex[6] = {0, 2, 3, 0, 1, 2};
    
    for(int iIndex = 0; iIndex < 6; iIndex++)
        {
            // Index eintragen
            pusIndices[iIndex] = aiIndex[iIndex];
        }

    pVertexBuffer->Unlock();
    pIndexBuffer->Unlock();
    
    D3D->SetRenderState(D3DRS_LIGHTING, TRUE);
    D3D->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
    D3D->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    D3D->SetRenderState(D3DRS_ZENABLE, TRUE);
    
    D3DMATERIAL9 Material;
    Material.Diffuse = tbColor(1.0f, 0.5f, 0.7f);
    Material.Ambient = tbColor(0.5f, 0.7f, 1.0f);
    Material.Specular = tbColor(0.7f, 0.7f, 0.7f);
    Material.Emissive = tbColor(1.0f, 0.7f, 1.0f);
    Material.Power = 10.0f;

    D3D->SetMaterial(&Material);

    // Die Textur laden
    pTexture = tbTextureManager::Instance().GetTexture("Texture.bmp");

    // Und nun die Textur einsetzen
    D3D->SetTexture(0, pTexture);

    D3D->SetStreamSource(0, pVertexBuffer, 0, sizeof(SVertex));
    D3D->SetIndices(pIndexBuffer);
    D3D->SetFVF(SVertex::dwFVF);

    if (FAILED(D3D->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,   
                                                0,                      
                                                 0,                     
                                                 4,     
                                                 0,                     
                                                 2)))
                                                 MessageBox(NULL, "Fehler!",
                "Fehler", MB_OK | MB_ICONEXCLAMATION);      


    D3D->EndScene();

    return TB_OK;

}


Also, wenn da jemand den Fehler entdecken kann, wäre ich sehr dankbar! :)

ProAmateur

Alter Hase

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

2

07.02.2012, 12:42

Ich würde sagen dein Camera Look at vector muss ein normalisiertervektor sein und somit die länge von eins haben...
Deiner hat die länge null, ich glaub daran könnte es liegen

Edit: Versuche mal P(1 -1 1) bzw. P(0,5 -0,5 0,73)
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ProAmateur« (07.02.2012, 12:50)


3

07.02.2012, 13:18

Also so?

C-/C++-Quelltext

1
2
vCameraPos = tbVector3(1.0f, -1.0f, 1.0f);
vCameraLookAt = tbVector3(0.5f, -0.5f, 0.73f);


Das funktioniert leider immer noch nicht.

ProAmateur

Alter Hase

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

4

07.02.2012, 14:13

Kann es sein dass dug dich mit vektoren noch nicht so gut auskennst?
Lass mal die Position auf 0 2 -1 und die Richtung auf 0,5 -0,5 0,75!
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

5

07.02.2012, 14:30

Das habe ich gerade schon direkt probiert, funktioniert auch nicht. Ich weiß auch nicht, ob es wirklich daran liegt...in manchen Beispielen aus dem Buch wird das mit dem (0,0,0)-LookAt-Vektor ja auch so gemacht. Das Normalisieren der Kameraachsen übernimmt dann tbMatrixCamera, wenn ich das richtig sehe.


edit: Aaaah, endlich hab ich den Fehler gefunden! Ich hatte beim Erstellen des Indexbuffers nur die halbe Größe angegeben...unfassbar, wie lange man sowas übersehen kann. :dash: Trotzdem danke für die Hilfe!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Eduard XVII.« (07.02.2012, 14:43)


Werbeanzeige