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

11

02.01.2012, 00:36

Nunja, das frage ich mich auch gerade...

Eine simples Rechteck versuche ich zu rendern und das Ergebnis sieht so aus:

(Link)

Ich hab alle Vertex und Indexdaten mit meiner Logbuchfunktion überprüfen lassen und die scheinen korrekt angekommen zu sein. Wie es aussieht muss ich wohl noch tiefer graben

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

12

02.01.2012, 01:50

Verwendest Du die richtige Grundgeometrie (Dreiecke)?
Hast Du alle Indices korrigiert? (x-1, wie dot schon schrieb).

Um die Indices loszuwerden gibt es eine einfache Methode: Im Prinzip sind die ja etwas so gespeichert
i 1// 2// 3//
i 1// 2// 4//
Wenn Du das nun ohne Indices haben willst, dann legst Du einfach ein Array an und speicherst die Vertexdaten in der gleichen Reihenfolge, also
1 2 3 1 2 4
Schwierig wird es erst, wenn Du aus den Dreiecken eine effizientere Struktur wie Tranglestrip verwenden willst, dann musst Du die Reihenfolge evtl. umbauen usw.
Und wenn Du einen Vertex und Indexbuffer verwendest, dann werden deine Indices im Indexbuffer zu
0 1 2 0 1 3
Textur- und Normalenwerte musst Du entsprechend auch entweder mit in den gleichen Vertexbuffer packen oder noch 2 weitere Buffer anlegen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

02.01.2012, 01:52

Wobei du dir generell wohl einfach anschauen solltest, wie IndexBuffer funktionieren. Zum Rendern allgemeiner Dreiecksnetze sind indizierte Dreieckslisten die potentiell effizienteste Methode...

14

02.01.2012, 02:06

Geometrie: D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST

Der Code sieht so ungefähr so aus:

C-/C++-Quelltext

1
2
3
for( int i = 0; i < numVertices; i++)
    {
        vertices[indices[i] - 1].pos = XMFLOAT3(*(vertsPtr + 0), *(vertsPtr + 1), *(vertsPtr + 2) );


Damit habe ich das x-1Problem wohl umgangen. Liegt der Fehler eurer Meinung nach also noch immer bei den Indices? Dann weiss ich halt wenigstens wo ich suchen muss.

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

15

02.01.2012, 15:29

Das Bild sieht so aus, als ob Du nicht alle Vertices renderst. Wenn Du links oder rechts aus dem richtigen Speicherbereich rutscht, bekommst Du in der Regel falsch liegende Vertices, d.h. deine Geometrie sieht dann falsch aus, weil der Speicher zufällig belegt ist und eigentlich immer anders als man will.

Bei deinem Codeschnipsel sehe ich allerdings nicht, dass Du vertsPtr veränderst, kann es sein, dass Du 2 mal das selbe Dreieck renderst?

16

03.01.2012, 16:05

Hmm wenn der gemeinte Speicherbereich "vertices[]" ist dann verstehe ich nicht wie ich da rausrutschen kann. Habe ich dann den Vertexbuffer nicht korrekt angelegt? :wacko:
Vertexstruktur:

C-/C++-Quelltext

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


Vertexbuffer:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
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;


Sorry, hier nochmal der Codeschnipsel wo vertsPtr auch verändert wird.

C-/C++-Quelltext

1
2
3
for( int i = 0; i < numVertices; i++)     
{         vertices[indices[i] - 1].pos = XMFLOAT3(*(vertsPtr + 0), *(vertsPtr + 1), *(vertsPtr + 2) );
vertsPtr += 3;


Ich hab es mal als LINESTRIP gerendert und wie es aussieht scheinen aber alle Vertexpositionen zu stimmen. Die 4 Punkte würden eine Fläche darstellen.


(Link)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »master_kenshin« (03.01.2012, 16:18)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

17

03.01.2012, 18:01

Musst du nicht noch das Layout für die Vertexdaten angeben?

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

18

03.01.2012, 19:30

Wie groß ist numVertices?
Als welche Geometrie renderst Du?
Mir kommt es so vor, als ob Du Triangles/Dreiecke renderst, aber nur 4 Punkte angibst. Dann ist das 2. Dreieck nicht vollständig definiert (insgesamt 6 Punkte nötig) und wird nicht mehr gezeichnet - es müssten ja 2 Werte erraten werden.

19

03.01.2012, 23:16

Musst du nicht noch das Layout für die Vertexdaten angeben?

C-/C++-Quelltext

1
2
3
4
5
6
7
const D3D11_INPUT_ELEMENT_DESC layout[] =
    {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }

    };





Wie groß ist numVertices?
Als welche Geometrie renderst Du?
Mir kommt es so vor, als ob Du Triangles/Dreiecke renderst, aber nur 4 Punkte angibst. Dann ist das 2. Dreieck nicht vollständig definiert (insgesamt 6 Punkte nötig) und wird nicht mehr gezeichnet - es müssten ja 2 Werte erraten werden.
numVertices = 4
Ich möchte gerne ein Rechteck rendern. Das besteht ja aus 2 Dreiecken hat aber nur 4 vertices. Deswegen habe ich ja die Vertexdaten mit Hilfe der Indexdaten in die richtige Reihenfolge gestellt. Also habe ich das falsch verstanden und benötige jetzt noch mehr Vertices?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

03.01.2012, 23:20

Was genau verstehst du unter der "richtigen Reihenfolge". Eine Dreiecksliste ist einfach nur das: Eine Liste aus Dreiecken; immer 3 Punkte werden zu einem Dreieck zusammengefasst.
Wenn du nur einen VertexBuffer verwendest (Draw()), brauchst du also 6 Vertices für 2 Dreiecke, dass 4 davon die gleichen Koordinaten haben ist dabei irrelevant.
Genau da kommt dann der IndexBuffer ins Spiel. Wenn du mit einem IndexBuffer renderst (DrawIndexed()), dann kommen die Vertices nicht einfach der Reihe nach aus dem VertexBuffer, sondern es werden der Reihe nach Indices aus dem IndexBuffer genommen, die dann auf Vertices im VertexBuffer verweisen. D.h. für 2 Dreiecke brauchst du dann 6 Indices. Dabei kann dann aber der gleiche Index mehrfach vorkommen und so können Dreiecke sich tatsächlich den selben Eckpunkt teilen.

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (03.01.2012, 23:28)


Werbeanzeige