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

26.05.2006, 12:17

XFiles zerschneiden mit D3DXConvertMeshSubsetToSingleStrip()

Hallo Leute

Ich versuche zur Zeit für jedes Material einen eigenen IndexBuffer zu erschaffen und zwar aus einem X-File.

Ich lade das XFile

C-/C++-Quelltext

1
2
3
4
5
6
7
    // Load the mesh from the specified file

    if( FAILED(hResult = D3DXLoadMeshFromX( pchSource, D3DXMESH_SYSTEMMEM, 
            wmGraphic3D::GetD3DDevice(), &AdjacencyBuffer, NULL, NULL,
            &this->dwNumMaterials, &pMesh ) ) ) 
    {
        WM_ERROR_DIRECTX("Konnte Mesh nicht laden; Datei nicht vorhanden", hResult, wmGraphic_ERROR);
    }


Anschließend optimiere ich das File wie es in der Doku vorgeschrieben ist

C-/C++-Quelltext

1
2
3
4
5
    // Optimieren

    if (FAILED(hResult = this->pMesh->OptimizeInplace(D3DXMESHOPT_ATTRSORT, (DWORD*)AdjacencyBuffer->GetBufferPointer(),
        NULL, NULL, NULL))) {
            WM_ERROR_DIRECTX("OptimizeInplace", hResult, wmGraphic_ERROR);
    }


Dann konvertiere ich den VertexBuffer

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    // VertexBuffer besorgen

    if (FAILED (hResult = this->pMesh->GetVertexBuffer(&pD3DVertexBuffer)))
        WM_ERROR_DIRECTX("Konnte VertexBuffer des Mehses nicht abrufen", hResult, wmGraphic_ERROR);
    // wird nochmal benutzt

    pD3DVertexBuffer->AddRef();

    // VertexBuffer init.

    if (pVertexBuffer->InitVertexBuffer(pD3DVertexBuffer, this->pMesh->GetNumBytesPerVertex(), this->pMesh->GetNumVertices()) == wmGraphic_ERROR)
        WM_ERROR("Konnte VertexBuffer nicht init.", wmGraphic_ERROR);

Und schließlich rufe ich für jedes Material einen Indexbuffer ab

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
wmGraphic_Result wmXReader::GenerateWmIndexBuffer(wmIndexBuffer *pIndexBuffer, int iMaterial) {
    // vars

    LPDIRECT3DINDEXBUFFER9 pD3DIndexBuffer = NULL;
    DWORD dwNumIndices;
    HRESULT hResult;

    hResult = D3DXConvertMeshSubsetToSingleStrip (this->pMesh, iMaterial, 0, &pD3DIndexBuffer, &dwNumIndices);

    // Failure control

     if( FAILED(hResult) )
     {
          WM_ERROR_DIRECTX("GetAttributeTable()", hResult, wmGraphic_ERROR);
     }

    // IntexBuffer init.

    if (pIndexBuffer->InitIndexBuffer(pD3DIndexBuffer, sizeof(unsigned short), dwNumIndices) == wmGraphic_ERROR)
        WM_ERROR("Konnte IndexBuffer nicht init.", wmGraphic_ERROR);

    // - THE END -

    return wmGraphic_OK;
}


Klappt alles fehlerfrei, nur das Ergebnis begeistert mich nicht gerade: http://www.basicworld.org/Markus/Flugzeug.jpg


Ich hab es schon ohne Trennen versucht (ein VertexBuffer und ein Indexbuffer), hat optimal geklappt.

Was könnte ich hier falsch gemacht haben?

mfg Markus

Phili

unregistriert

2

26.05.2006, 12:24

ROFL

ich hatte nen ähnliches Prob mal mit nem Fehlerhaften/weil slbstgeschriebenen) konverter: Ich hab von x in nen anderes Format konvertiert und die Vierecke irgendwie immer falschrum eingelesen.

Ich würds mal mir D3DCULL_NONE versuchen!

soxx

Frischling

Beiträge: 53

Wohnort: Klagenfurt

  • Private Nachricht senden

3

26.05.2006, 12:33

Hallo !

habe zwar noch nie was mit D3DXConvertMeshSubsetToSingleStrip gemacht, aber vielleicht liegts daran:

HRESULT WINAPI
D3DXConvertMeshSubsetToSingleStrip(
LPD3DXBASEMESH MeshIn,
DWORD AttribId,
DWORD IBOptions == bei dir 0
LPDIRECT3DINDEXBUFFER9 *ppIndexBuffer,
DWORD *pNumIndices);


[in] Combination of one or more flags from the D3DXMESH enumeration, specifying options for creating the index buffer. Cannot be D3DXMESH_32BIT. The index buffer will be created with 32-bit or 16-bit indices depending on the format of the index buffer of the mesh specified by the MeshIn parameter.

typedef enum D3DXMESH
{
D3DXMESH_32BIT = 0x001,
D3DXMESH_DONOTCLIP = 0x002,
D3DXMESH_POINTS = 0x004,
D3DXMESH_RTPATCHES = 0x008,
D3DXMESH_NPATCHES = 0x4000,
D3DXMESH_VB_SYSTEMMEM = 0x010,
D3DXMESH_VB_MANAGED = 0x020,
D3DXMESH_VB_WRITEONLY = 0x040,
D3DXMESH_VB_DYNAMIC = 0x080,
D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000,
D3DXMESH_IB_SYSTEMMEM = 0x100,
D3DXMESH_IB_MANAGED = 0x200,
D3DXMESH_IB_WRITEONLY = 0x400,
D3DXMESH_IB_DYNAMIC = 0x800,
D3DXMESH_IB_SOFTWAREPROCESSING = 0x10000,
D3DXMESH_VB_SHARE = 0x1000,
D3DXMESH_USEHWONLY = 0x2000,
D3DXMESH_SYSTEMMEM = 0x110,
D3DXMESH_MANAGED = 0x220,
D3DXMESH_WRITEONLY = 0x440,
D3DXMESH_DYNAMIC = 0x880,
D3DXMESH_SOFTWAREPROCESSING = 0x18000,
} D3DXMESH, *LPD3DXMESH;


mfg
soxx

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

26.05.2006, 12:47

"Ich versuche zur Zeit für jedes Material einen eigenen IndexBuffer zu erschaffen und zwar aus einem X-File. "

WAS willst du denn damit erreichen?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

26.05.2006, 16:07

@Nox: Ganz einfach: Jedes Material hat eine eigene Textur und einen eigenen Shader. So setze ich in einem Renderdurchgang für jedes Material einen eigenen Shader, eigenen IndexBuffer und eine eigene Textur. Es ist ein Konvertor.

@soxx: Ne leider nicht! Trotzdem danke

@Phili: Hatte ich bereits versucht. In der Tat sind schon mehr, allerdings trotzdem immernoch jede Menge Löcher und total falsche Texturkoords --> Total falsche Inidices. Trotzdem danke

mfg Markus

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

26.05.2006, 16:17

Dir ist schon klar, dass das gelinde gesagt hirnrissig ist? Du hast doch in den Materialien schon gespeichert, welchen Bereich er von dem Indexbuffer in einem Durchgang er braucht. Es macht wenig Sinn, dann den einen großen in z.b. 4 kleine zu unterteilen. Du gewinnst dadurch nichts und der Bus wird absolut unnötig belastet.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Phili

unregistriert

7

26.05.2006, 16:31

@Nox

Zitat

Es ist ein Konvertor

Da gehts doch nun wirklich nicht um performance...

8

26.05.2006, 16:31

@Nox: thx, für die Info, hätte mich trotzdem intressiert wie das funzt!

mfg Markus

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

26.05.2006, 17:20

Wenn du nur das Trennen der einzelnen Materialbereiche erreichen willst, musst du nur die einzelnen Materialen durchgehen und dene Angaben entsprechend die einzelnen Abschnitte in jeweil einen eigenen Indexbuffer speichern. Also bildlich gesprochen. Du schneidest den großen in viele kleine indem du die Infos aus den Materialen nutzt.
Im Endeffekt machst du also per Hand, dass was die Funktion tun würde.

Wenn du jedoch die Funktion unbedingt nutzen willst, würde ich dir empfehlen mal zu schauen, ob die Buffer nicht vorher selbst erstellen musst. Wenn nicht, dann ist das Init auf eigentlich unnötig.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

10

26.05.2006, 17:23

Mit

C-/C++-Quelltext

1
pMesh->GetAttributeTable()

kann man es schließlich "manuell" proggen, nach Nox's Anschaung, was dann auch funzt.

Thx für die Hilfe

mfg Markus

Werbeanzeige