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

  • »CoookeiMonssterr« ist der Autor dieses Themas

Beiträge: 25

Wohnort: Schweiz

Beruf: Informatik-Lehrling

  • Private Nachricht senden

1

09.12.2014, 16:12

Klasse CMesh

Hallo zusammen

Ich habe eine Klasse CMesh erstellt, da mir das von Schrompf empfohlen wurde.

Ich habe da einfach mal drauflos gearbeitet und etwas zusammengestellt. Ich weiss jetzt leider nicht, ob ich so gemacht habe, wie es gedacht ist. Funktionieren tut es momentan nicht, woran es liegt kann ich nicht sagen :dash: :



Hier einmal die Headerdatei CMesh.h:

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
#pragma once

#include "stdafx.h"
#include "CDirectX.h"

#define MAX_VERTEX_PER_MESH 100

/*
* Class CMesh
* -----------
*
* This is a mesh. It contains a vertex and a index buffer.
*
*/
class CMesh
{
    
private:

    // Attribute
    CDirectX*                   m_directx;
    std::vector<VERTEX>*        m_vertezies;
    std::vector<DWORD>*         m_indezies;
    ID3D11Buffer*               m_vbuffer;
    ID3D11Buffer*               m_ibuffer;
    D3D10_PRIMITIVE_TOPOLOGY    m_topology;
    UINT                        m_count;

    // Private methods
    void CreateVBuffer(UINT);
    void CreateIBuffer(UINT);

public:

    // Constructor and destructor
    CMesh(CDirectX*);
    ~CMesh();

    // Public methods
    void Create(std::vector<VERTEX>*, std::vector<DWORD>*, D3D10_PRIMITIVE_TOPOLOGY);

    // Getter
    ID3D11Buffer**              GetVBuffer()    {return &m_vbuffer;};
    ID3D11Buffer**              GetIBuffer()    {return &m_ibuffer;};
    D3D10_PRIMITIVE_TOPOLOGY    GetTopology()   {return m_topology;};
    UINT                        GetCount()      {return m_count;};

};

//




Hier die Quelldatei CMesh.cpp:

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
#include "stdafx.h"
#include "CMesh.h"

/*
* Constructor of CMesh
* --------------------
*
* Inits some nullptr
*
*/
CMesh::CMesh(CDirectX* p_directx) : m_directx(p_directx)
{
    m_vbuffer = nullptr;
    m_ibuffer = nullptr;
};
/*
* Destructor of CMesh
* -------------------
*
* Releases the com objects
*
*/
CMesh::~CMesh()
{
    SafeRelease(&m_vbuffer);
    SafeRelease(&m_ibuffer);
};

/* 
* Function CMesg::CreateVBuffer
* -----------------------------
*
* Creates a vertex buffer
*
*/
void CMesh::CreateVBuffer(UINT p_size)
{
    D3D11_BUFFER_DESC bd;
    ZeroMemory(&bd, sizeof(bd));
    bd.Usage            = D3D11_USAGE_DYNAMIC;             
    bd.ByteWidth        = sizeof(VERTEX) * p_size;          
    bd.BindFlags        = D3D11_BIND_VERTEX_BUFFER;    
    bd.CPUAccessFlags   = D3D11_CPU_ACCESS_WRITE; 
    m_directx->dev->CreateBuffer(&bd, NULL, &m_vbuffer);
};
/* 
* Function CMesg::CreateIBuffer
* -----------------------------
*
* Creates a index buffer
*
*/
void CMesh::CreateIBuffer(UINT p_size)
{
    D3D11_BUFFER_DESC bd;
    ZeroMemory(&bd, sizeof(bd));
    bd.Usage            = D3D11_USAGE_DYNAMIC;             
    bd.ByteWidth        = sizeof(DWORD) * p_size;          
    bd.BindFlags        = D3D11_BIND_INDEX_BUFFER;    
    bd.CPUAccessFlags   = D3D11_CPU_ACCESS_WRITE; 
    m_directx->dev->CreateBuffer(&bd, NULL, &m_ibuffer);
};

/*
* Function CMesh::Create
* ----------------------
*
* Fills the the buffers
*
*/
void CMesh::Create(std::vector<VERTEX>* p_vbuffer, std::vector<DWORD>* p_ibuffer, D3D10_PRIMITIVE_TOPOLOGY p_topology)
{
    // Save some informations
    m_topology  = p_topology;
    m_count     = p_vbuffer->size();
    m_vertezies = p_vbuffer;
    m_indezies  = p_ibuffer;

    // Fillin IBuffer
    CreateIBuffer(p_ibuffer->size());
    DWORD ind[MAX_VERTEX_PER_MESH*3];
    int ii = 0;
    for(std::vector<DWORD>::iterator it = p_ibuffer->begin(); it != p_ibuffer->end(); it++)
    {
        ind[ii] = *it;
        ii++;
    }
    D3D11_MAPPED_SUBRESOURCE msi;
    m_directx->devcon->Map(m_ibuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &msi);
    memcpy(msi.pData, ind, sizeof(ind));  
    m_directx->devcon->Unmap(m_ibuffer, NULL);

    // Fillin VBuffer
    CreateVBuffer(p_vbuffer->size());
    VERTEX ver[MAX_VERTEX_PER_MESH];
    int iv = 0;
    for(std::vector<VERTEX>::iterator it = p_vbuffer->begin(); it != p_vbuffer->end(); it++)
    {
        ver[iv] = *it;
        iv++;
    }
    D3D11_MAPPED_SUBRESOURCE msv;
    m_directx->devcon->Map(m_vbuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &msv);
    memcpy(msv.pData, ver, sizeof(ver));  
    m_directx->devcon->Unmap(m_vbuffer, NULL);
};

//



Hier die Render-Methode in welcher ein Mesh gerendert wird:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* Function CRenderer::Render
* --------------------------
*
* Renders the vertexes in the buffer
*
*/
void CRenderer::Render(CMesh* p_mesh)
{
    UINT stride = sizeof(VERTEX);
    UINT offset = 0;
    m_directx->devcon->IASetVertexBuffers(0, 1, p_mesh->GetVBuffer(), &stride, &offset);
    m_directx->devcon->IASetIndexBuffer(*p_mesh->GetIBuffer(), DXGI_FORMAT_R16_UINT, 0);
    m_directx->devcon->IASetPrimitiveTopology(p_mesh->GetTopology());
    m_directx->devcon->DrawIndexed(p_mesh->GetCount(), 0, 0);
};




Hier der Aufruf das Erstellen des Mesh-Objekts:

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
        // Create Triangle
    std::vector<VERTEX> ver;
    ver.push_back(VERTEX(-1.0f, 1.0f, -1.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f)));
    ver.push_back(VERTEX(1.0f, 1.0f, -1.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f)));
    ver.push_back(VERTEX(1.0f, 1.0f, 1.0f, D3DXCOLOR(0.0f, 1.0f, 1.0f, 1.0f)));
    ver.push_back(VERTEX(-1.0f, 1.0f, 1.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f)));
    ver.push_back(VERTEX(-1.0f, -1.0f, -1.0f, D3DXCOLOR(1.0f, 0.0f, 1.0f, 1.0f)));
    ver.push_back(VERTEX(1.0f, -1.0f, -1.0f, D3DXCOLOR(1.0f, 1.0f, 0.0f, 1.0f)));
    ver.push_back(VERTEX(1.0f, -1.0f, 1.0f, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f)));
    ver.push_back(VERTEX(-1.0f, -1.0f, 1.0f, D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f))); 
    WORD indices[] =
    {
        3,1,0,
        2,1,3,
        0,5,4,
        1,5,0,
        3,4,7,
        0,4,3,
        1,6,5,
        2,6,1,
        2,7,6,
        3,7,2,
        6,4,5,
        7,4,6,
    };
    std::vector<DWORD> ind;
    ind.insert(ind.end(), &indices[0], &indices[36]);

    // Create Mesh
    CMesh mesh(&directx);
    mesh.Create(&ver, &ind, D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);


Seid bitte nicht zu streng. Ich habe mich noch nicht lange mit DirectX beschäftigt. :fie:

Ich hoffe ihr könnte mir Fehler, Verbesserungen oder allgemein Änderungen zeigen.

Mfg

CoookeiMonssterr

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

2

09.12.2014, 17:31

Da du sagst es funktioniert nicht, nehme ich an es wird nicht gerendert ^^

Bei solchen Fehlern würde ich erstmal schauen was mir das Debuglayer sagt. Einfach mal auf Direct3D Fehler / Warnings prüfen.

Eine Sache wo ich mir nicht sicher bin ob das so stimmt:

C-/C++-Quelltext

1
(...)->DrawIndexed(pMesh->getCount(), 0, 0);


C-/C++-Quelltext

1
2
3
int CMesh::getCount(){
 return m_count;
}


C-/C++-Quelltext

1
2
3
//...
m_count = p_vbuffer->size();
//...


Ich habe den ganzen Code jetzt nicht ganz analysiert, aber ich nehme an, dass p_vbuffer dein Vertex Buffer ist.
Das bedeutet, m_count ist die Größe des Vertex Buffers, oder je nach Implementierung die Anzahl der Elemente im Buffer.

C-/C++-Quelltext

1
(...)->DrawIndexed(pMesh->getCount(), 0, 0);


Hier müsste dann der Fehler liegen. Der erste Parameter von DrawIndexed ist die Anzahl der Indices.

Außerdem ist der Plural von Vertex Vertices, von Index Indices ^^

Hoffentlich behebt das hier deinen Fehler, ich arbeite ja gerade selber mit DirectX 11 (.1/.2) auf C# und weis wie frustrierend es ist, wenn es mal nicht funktioniert.
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Julién« (09.12.2014, 17:37) aus folgendem Grund: Ich nix Deutsch, Ich nix Rechtschreibung.


  • »CoookeiMonssterr« ist der Autor dieses Themas

Beiträge: 25

Wohnort: Schweiz

Beruf: Informatik-Lehrling

  • Private Nachricht senden

3

09.12.2014, 17:39

Vielen Dank für die Antwort, die Änderung hat jedoch keinen Einfluss auf das Resultat ;(

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

4

09.12.2014, 17:54

C-/C++-Quelltext

1
ind.insert(ind.end(), &indices[0], &indices[36]);


Ich bin mir darüber jetzt selber nicht sicher. Zeigst du mit &indices[36] auf den letzten Index?
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

5

09.12.2014, 18:35

Du füllst Deinen index buffer mit DWORDs ab, bindest ihn aber mit DXGI_FORMAT_R16_UINT (DWORD sind 32-bit integers). Vielleicht geht schon vorher etwas schief, Du wechselst nämlich zwischen WORD und DWORD.

Falls nichts gerendert wird (und der D3D Debug layer nichts mehr zu beanstanden hat), nicht zögern PIX oder den Graphics Debugger zu benutzen. Da etwa mind. ein Dutzend Dinge schiefgehen können (falscher Blendmodus oder sonstige falsche states, falsche oder leere buffer gebunden, Kamera zeigt in die falsche Richtung, falscher/kein shader, falsches layout, etc.etc.), ist es wirklich einfacher mal einen Snapshot anzukucken.

  • »CoookeiMonssterr« ist der Autor dieses Themas

Beiträge: 25

Wohnort: Schweiz

Beruf: Informatik-Lehrling

  • Private Nachricht senden

6

10.12.2014, 21:50

Ok. Entweder wisst ihr selber nicht, was da passiert oder ihr habt keine Lust oder Zeit mir zu helfen. :fie:

Schade. ;( Ich dachte ihr würdet den Fehler sicher mit nur mit einmal hinschauen erkennen... :vain:

Naja. Egal. Trotzdem danke für die Antworten. :thumbsup:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

10.12.2014, 21:53

Ok. Entweder wisst ihr selber nicht, was da passiert oder ihr habt keine Lust oder Zeit mir zu helfen. :fie:
Was? Also gerade der letzte Beitrag zeigt doch ein paar deutliche Probleme auf.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

10.12.2014, 22:14

Mein Beitrag sollte nicht heissen: "Such Deinen Fehler selber", sondern sollte - vielleicht nicht ganz offensichtlich - auch darauf hinweisen, dass wir hier zu wenig Code sehen, um ein endgültiges Urteil zu fällen. Nicht selten beim Bugsuchen sucht man nämlich an der falschen Stelle.

Und die vorhandenen Tools zu nutzen ist sicher auch kein schlechter Tipp.

Thargan

Frischling

Beiträge: 14

Wohnort: Lübeck

  • Private Nachricht senden

9

10.12.2014, 22:31

Du übergibst Deinem Constructor das DirectX, machst darin aber nichts damit, wie z.B. Membervariable initialisieren.
In Create jedoch verwendest Du die nicht initialisierte Member m_directX.

Danach habe ich aufgehört zu lesen, da es soo auf keinen Fall klappen kann...meine ich.

Grüsse

10

10.12.2014, 22:46

Doch, doch, ist in der member initializer list:

Quellcode

1
CMesh::CMesh(CDirectX* p_directx) : m_directx(p_directx)


Ansonsten würde es bei der ersten Dereferenzierung abschmieren.

Noch was an CoookeiMonssterr: Wenn du Hilfe willst, beantworte bitte auch unsere Fragen. Insbesondere fragte Julién, ob der D3D Debug layer etwas ausspuckt.

Werbeanzeige