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

21

04.01.2012, 01:31

Vielen Dank dot, das war absolut verständlich und meine Verwirrung hat sich bis auf einen Punkt(Vertex) gelegt. Ich verstehe jetzt bloss noch nicht wie ich aus den Daten der Datei (f 1/4/3/2) nun 6 Indices basteln soll. Scheint als wäre ich schwer von Begriff...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

22

04.01.2012, 02:05

Zuallererst: Die Faces in einer .obj Datei sind nicht notwendigerweise Dreiecke.
Aber wenn wir mal davon ausgehen dass dein .obj nur aus Dreiecken besteht und noch ein paar andere Spezialitäten des .obj Formats ignorieren, dann haben wir es mit folgendem Format zu tun:

Quellcode

1
f v1/t1/n1 v2/t2/n2 v3/t3/n3

vi ist dabei der Index der Vertexkoordinaten, ti der Index der Texturkoordinaten und ni der Index des Normalvektors des i-ten Vertex des Dreiecks. Also z.B.:

Quellcode

1
f 1/1/1 2/2/1 3/3/1

Texturkoordinaten und/oder Normalen können auch weggelassen werden:

Quellcode

1
2
3
f   1    2    3   # Position
f  1/1  2/1  3/1  # Position und Texturkoordinaten
f 1//1 2//1 3//1  # Position und Normalvektor

Ich denke dein Problem ist nun, dass die jeweiligen Koordinaten alle einzeln referenziert werden, du aber ganze Vertices brauchst.
Ich würde dir empfehlen, Texturkoordinaten und Normalen erstmal zu ignorieren und einfach nur die Positionen zu berücksichtigen. Mit der Frage, wie du nun aus diesen verschiedenen Indices am besten Vertex- und IndexBuffer baust, kannst du dich auch später noch beschäftigen.
Wenn du mal nur die Positionen nimmst wird das ganze plötzlich sehr einfach ;)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (04.01.2012, 02:13)


23

06.01.2012, 20:51

Ahhh klar. Ich habe beim Exporter nicht angegeben ob das Mesh in einer Dreiecksliste gespeichert wird. Nun ich wage zu behaupten, dass ich es jetzt verstehe :)

Also im Überblick läuft das ganze dann so ab:

- Vertexbuffer mit den Vertices füllen, ohne die Reihenfolge der Punkte zu manipulieren. (Bei einem Rechteck wären wir dann auf 4 Vertices)

- Indexbuffer füllen. X-1 da der Buffer ja bei "0" anfängt. (Ich habe das Rechteck jetzt in eine Dreicksliste gepackt und die Indices lauten im Indexbuffer: 0, 3, 2, 0, 2, 1)

- Als Trianglelist rendern



Ich hab mein Ergebnis mal als LineStrip gerendert damit man erkennt welche Punkte schlussendlich auch auf dem Monitor ankommen. Oh Bitte sagt mir, ich habe etwas komplett falsch verstanden. Sonst weiss ich auch nicht weiter...


(Link)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

24

06.01.2012, 22:22

Klingt eigentlich als hättest du nun alles richtig verstanden. Zeig mal wie du renderst ;)

25

06.01.2012, 22:29

Klingt beruhigend. Hier der Code meiner Renderfunktion. Sry für die Unordnung im Quelltext, ich hab SimpleSample jetzt glaub ich schon 100 mal umgeschrieben und nicht auf die Übersicht aufgepasst.

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
float ClearColor[4] = { 0.176f, 0.196f, 0.667f, 0.0f };

    ID3D11RenderTargetView* pRTV = DXUTGetD3D11RenderTargetView();
    ID3D11DepthStencilView* pDSV = DXUTGetD3D11DepthStencilView();
    pd3dImmediateContext->ClearRenderTargetView( pRTV, ClearColor );
    pd3dImmediateContext->ClearDepthStencilView( pDSV, D3D11_CLEAR_DEPTH, 1.0, 0 ); 

    D3DXMATRIX mWorld = *g_Camera.GetWorldMatrix();
    D3DXMATRIX mView = *g_Camera.GetViewMatrix();
    D3DXMATRIX mProj = *g_Camera.GetProjMatrix();
    D3DXMATRIX mWorldViewProjection = mWorld * mView * mProj;

    D3D11_MAPPED_SUBRESOURCE MappedResource;
    V(pd3dImmediateContext->Map(g_pcbVSPerObject11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource));
    CB_VS_PER_OBJECT* pVSPerObject = (CB_VS_PER_OBJECT*)MappedResource.pData;

    //Matrizen
    D3DXMatrixTranspose(&pVSPerObject->m_mWorldViewProjection, &mWorldViewProjection);
    D3DXMatrixTranspose(&pVSPerObject->m_mWorld, &mWorld);

    //Material
    pVSPerObject->m_MaterialAmbientColor = D3DXVECTOR4(0.3f, 0.3f, 0.3f, 1.0f);
    pVSPerObject->m_MaterialDiffuseColor = D3DXVECTOR4(0.7f, 0.7f, 0.7f, 1.0f);

    pd3dImmediateContext->Unmap(g_pcbVSPerObject11, 0);
    
    //Beleuchtung
    pd3dImmediateContext->Map(g_pcbVSPerFrame11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource);
    CB_VS_PER_FRAME* pVSPerFrame = (CB_VS_PER_FRAME*)MappedResource.pData;
    pVSPerFrame->m_vLightDir = D3DXVECTOR3(0, 0.707f, -0.707f);
    pVSPerFrame->m_LightDiffuse = D3DXVECTOR4(1.f, 1.f, 1.f, 1.f);

    pd3dImmediateContext->Unmap(g_pcbVSPerFrame11, 0);

    pd3dImmediateContext->VSSetConstantBuffers(0, 1, &g_pcbVSPerObject11);
    pd3dImmediateContext->VSSetConstantBuffers(1, 1, &g_pcbVSPerFrame11);

    pd3dImmediateContext->VSSetShader(g_pVertexShader11, NULL, 0);
    pd3dImmediateContext->PSSetShader(g_pPixelShader11, NULL, 0);

    pd3dImmediateContext->PSSetSamplers(0, 1, &g_pSamLinear);

    ID3D11ShaderResourceView* aRViews[1] = {g_pRV};
    pd3dImmediateContext->PSSetShaderResources(0, 1, aRViews);

    pd3dImmediateContext->RSSetState(g_pRasterState);

    // Inputlayout setzen

    pd3dImmediateContext->IASetInputLayout( g_pLayout11 );

    //Primitve topology setzen
    pd3dImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_LINELIST );
    
    // Rendern
    pd3dImmediateContext->DrawIndexed(numIndices, 0, 0);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

06.01.2012, 22:32

Wie groß is dein numIndices?

27

06.01.2012, 22:33

6

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

06.01.2012, 22:35

Hm ok, das ist merkwürdig. Kann es sein dass deine Buffer zu klein sind oder so?

29

06.01.2012, 22:41

Die Frage hab ich mir auch schon mal gestellt ?( Ob da wohl Daten verloren gehen weil kein Platz besteht?

Ich nehme an wir sprechen vom Vertex und dem Indexbuffer. Hier der 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
D3D11_BUFFER_DESC vertexDesc;
    ZeroMemory( &vertexDesc, sizeof( vertexDesc ) );
    vertexDesc.Usage = D3D11_USAGE_DEFAULT;
    vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexDesc.ByteWidth = sizeof( VertexPos ) * numVertices;

    D3D11_SUBRESOURCE_DATA resourceData;
    ZeroMemory( &resourceData, sizeof( resourceData ) );
    resourceData.pSysMem = vt;

    hr = pd3dDevice->CreateBuffer( &vertexDesc, &resourceData, &g_pVertexBuffer );
    if( FAILED( hr ) )
    {
        MessageBox( NULL, DXGetErrorString(hr), L"Error!", MB_ICONINFORMATION | MB_OK );
    }

    D3D11_BUFFER_DESC id;
    ZeroMemory( &id, sizeof( id ) );
    id.Usage = D3D11_USAGE_DEFAULT;
    id.ByteWidth = sizeof( indices ) * numIndices;
    id.BindFlags = D3D11_BIND_INDEX_BUFFER;
    id.CPUAccessFlags = 0;
    id.MiscFlags = 0;
    
    D3D11_SUBRESOURCE_DATA InitData;
    ZeroMemory( &InitData, sizeof( InitData ) );
    InitData.pSysMem = indices;
    InitData.SysMemPitch = 0;
    InitData.SysMemSlicePitch = 0;

    hr = pd3dDevice->CreateBuffer( &id, &InitData, &g_pIndexBuffer );
    if( FAILED( hr ) )
    {
        MessageBox( NULL, DXGetErrorString(hr), L"Error!", MB_ICONINFORMATION | MB_OK );
    }


VertexStruktur:

C-/C++-Quelltext

1
2
3
4
5
struct VertexPos
{
    XMFLOAT3 pos;
    XMFLOAT2 tex0;
};

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

30

06.01.2012, 22:46

Was ist denn indices genau?
Wo setzt du denn die Buffer in den InputAssembler?

Werbeanzeige