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

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

27.07.2013, 19:34

Vertexbuffer ohne gültige Daten erzeugen

Hallo. Kann man einen dynamischen Vertexbuffer mit dieser D3D11_SUBRESOURCE_DATA Konfiguration initialisieren?

C-/C++-Quelltext

1
2
3
4
5
6
7
void* pMem = MemAlloc(vertexBufferSize);
// pMem enthält keine Daten, die von mir angegeben wurden

D3D11_SUBRESOURCE_DATA vinitData;
vinitData.pSysMem = pMem;
vinitData.SysMemPitch = 0;
vinitData.SysMemSlicePitch = 0;


Und kann man mit memcpy arbeiten, wenn man den Buffer neu beschreiben möchte? In etwas so:

C-/C++-Quelltext

1
2
3
4
5
6
7
D3D11_MAPPED_SUBRESOURCE dat;
d3dContext->Map(buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &dat);

// pMem enthält die neuen Daten
memcpy(dat.pData, pMem, bufferSize);

d3dContext->Unmap(buffer, 0);

Oder gibt es eine effizientere Lösung?

Danke im Voraus.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.07.2013, 23:44

Wenn du den Buffer nicht initialisieren willst, dann kannst du an CreateBuffer() auch einfach einen nullptr übergeben statt einem Pointer auf eine D3D11_SUBRESOURCE_DATA. Und ja, du kannst mit memcpy() arbeiten. Effizientere Lösung gibt es vielleicht, hängt davon ab, was genau du eigentlich machen willst... ;)

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

3

28.07.2013, 14:10

Zu 1: Das habe ich gesucht.

Zu 2: Es geht darum, einen dynamischen Vertexbuffer mit Daten zu beschreiben. Eigentlich wollte ich nur die geänderten Vertizes in den Buffer kopieren. Aber ich habe dazu nichts gefunden. Gibt es eine Möglichkeit?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

28.07.2013, 14:18

Die Frage ist: Wofür brauchst du diesen Buffer, was genau willst du damit zeichnen, wann, wie, wo und wieso soll er mit was beschrieben werden?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

28.07.2013, 17:32

Zu 1: Das habe ich gesucht.

Zu 2: Es geht darum, einen dynamischen Vertexbuffer mit Daten zu beschreiben. Eigentlich wollte ich nur die geänderten Vertizes in den Buffer kopieren. Aber ich habe dazu nichts gefunden. Gibt es eine Möglichkeit?


Es gibt statt D3D11_MAP_WRITE_DISCARD auch die Möglichkeit Map mit D3D11_MAP_WRITE aufzurufen. Allerdings stellt D3D11_MAP_WRITE einige Anforderungen an die Resource, die ich gerade nicht auswendig kenne und diese Option für deinen Anwendungsfall nutzlos machen könnte.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

28.07.2013, 18:02

Es gibt eben extrem viele verschiedene Möglichkeiten um Buffer zu befüllen und welche effizient ist und welche nicht hängt eben davon ab, was genau man konkret mit dem Buffer vor hat. Die Information, dass es sich um einen "dynamischen Vertexbuffer" handelt, ist leider nicht konkret genug, als dass man eine konkrete Antwort geben könnte. Was genau willst du mit diesem Buffer rendern bzw. wofür brauchst du ihn?

Zu 1: Das habe ich gesucht.

Zu 2: Es geht darum, einen dynamischen Vertexbuffer mit Daten zu beschreiben. Eigentlich wollte ich nur die geänderten Vertizes in den Buffer kopieren. Aber ich habe dazu nichts gefunden. Gibt es eine Möglichkeit?


Es gibt statt D3D11_MAP_WRITE_DISCARD auch die Möglichkeit Map mit D3D11_MAP_WRITE aufzurufen. Allerdings stellt D3D11_MAP_WRITE einige Anforderungen an die Resource, die ich gerade nicht auswendig kenne und diese Option für deinen Anwendungsfall nutzlos machen könnte.

Ich vermute mal, du meinst D3D11_MAP_WRITE_NO_OVERWRITE!? Je nachdem, was man machen will (;)), wäre das eben beispielsweise einer der Wege um das Ganze noch effizienter zu gestalten...

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

7

28.07.2013, 22:56

Es ist erst zur Laufzeit bekannt, wofür der Buffer benutzt wird. Aber geht man mal von einem primitiven Vertexgitter aus, für Wasseröberflächen o.Ä.. Es soll eine Welle an Position X geben. Dann muss ich nur die Vertices verändern, die auch wirklich betroffen sind und nicht den kompletten Buffer neu beschreiben. Verwendungszweck soll in diesem Szenario einfach mal ein Ozean sein, der mit Hilfe eines Vertexbuffers gezeichnet wird. D3D11_MAP_WRITE_NO_OVERWRITE bringt mir da recht wenig, genau wie D3D11_MAP_WRITE_DISCARD und D3D11_MAP_WRITE. Ersteres setzt voraus, dass der ganze Buffer neu beschrieben wird und letzteres ist nicht mit dem Flag D3D11_USAGE_DYNAMIC kompatibel.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

28.07.2013, 23:11

Jo, in dem Fall einfach normal mappen, oder z.B. UpdateSubresource() verwenden. Oder die Wassersimulation z.B. in einem ComputeShader direkt auf der GPU laufen lassen... ;)

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

9

29.07.2013, 14:56

Soweit ich weiß ist UpdateSubresource() sehr viel langsamer im Vergleich dazu, einfach den kompletten Buffer zu beschreiben. Liege ich da richtig?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

29.07.2013, 15:05

Soweit ich weiß ist UpdateSubresource() sehr viel langsamer im Vergleich dazu, einfach den kompletten Buffer zu beschreiben.

Besonders in deinem Fall wär ich mir da nicht so sicher. Insbesondere willst du ja eigentlich nicht immer den ganzen Buffer beschreiben, dachte ich!?

Werbeanzeige