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

10.09.2008, 09:54

Der gute alte VertexBuffer und andere Probleme

Hallo zusammen.
Ich hätte da mal ein paar Fragen, die mich schon länger beschäftigen :D.

1. Wie setzt man den Vertexbuffer(/Indexbuffer) richtig ein? Was ich meine ist, woran mache ich fest wann oder für was ich einen eigenen VB brauche. Je nach Primitive Type oder am Objekt an sich (z.B. einen für jedes Mesh, usw.) oder je nach größe der Datenmenge, die sich in meiner Szene vor dem Rendern angesammelt hat?

2. Ich weiß nicht, ob es mir nur so geht, aber ich bekomm das irgentwie nicht in den Kopf. Normalerweise sieht der Ablauf bei einer App. mit DX ja so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Fenster erstellen
--DX erstellen
----Enumeration
----PresentParams
----Device erstellen
----XXX
----XXX
----XXX
----Renderstates
------Mainloop
--------Render
--------Update
--DX zerstören
Fenster zerstören

Meine Frage lautet nun, wann ich am besten das Material und das Licht. Meiner Meinung nach müsste das dort sein, wo XXX steht und ist dann so lange gültig bis etwas neues gesetzt wurde??? Ich könnte mir aber auch Vorstellen, das man das Material und das Licht erst kurz vorm Rendern setzt, quasi in der Hauptschleife, damit es dann bei jedem Frame neu gesetzt werden kann. Wie macht ihr das bei euren Engines? oder habt ihr zufälligerweise irgentwo ein Ablaufdiagram rumliegen :-).

Das war eigentlich schon alles (im Moment jedenfalls :-)). Danke schon mal ...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

10.09.2008, 09:57

Re: Der gute alte VertexBuffer und andere Probleme

Zitat von »"Systematic_Chaos"«


1. Wie setzt man den Vertexbuffer(/Indexbuffer) richtig ein? Was ich meine ist, woran mache ich fest wann oder für was ich einen eigenen VB brauche. Je nach Primitive Type oder am Objekt an sich (z.B. einen für jedes Mesh, usw.) oder je nach größe der Datenmenge, die sich in meiner Szene vor dem Rendern angesammelt hat?


Nimm für alles Vertexpuffer.
@D13_Dreinig

3

10.09.2008, 10:14

Zitat

Nimm für alles Vertexpuffer.


Sorry, wenn ich jetzt nochmal frage. Wie für alles :?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

10.09.2008, 10:28

Zitat von »"Systematic_Chaos"«

Sorry, wenn ich jetzt nochmal frage. Wie für alles :Confused:


naja so wie er es gesagt hat: alles :p. Alles, was du an geometrie rendern möchtest ist mit VertexBuffern immer die schnellste methode (solange man einige sachen beachtet).

5

10.09.2008, 10:49

Wahrscheinlich die sache mitm dynamischen VB usw. könnt ich mir denken.

Ich weiß nicht ob ich das jetzt richtig verstanden hab:
Achtung noob pseudocode :-)

Quellcode

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
// Model
Model->Load(/*irgentwas*/)
{
  //-> Daten speichern
}

Model->Render(/**/)
{
  //-> CreateVertexBuffer(/**/);
  //-> VB->Lock(/**/);
  //-> VB->Unlock(/**/);
  //-> SetStreamSource(/**/);
  //-> DrawPrimitive(/**/);
}

// "0815" Dreieck
Dreieck->Create(/**/)
{
  //-> Vertices setzen
}

Dreieck->Render(/**/)
{
  //-> CreateVertexBuffer(/**/);
  //-> VB->Lock(/**/);
  //-> VB->Unlock(/**/);
  //-> SetStreamSource(/**/);
  //-> DrawPrimitive(/**/);
}

// Zeichnen
Render(/**/)
{  
  m_pDevice->BeginScene();
  m_pDreieck->Render();
  m_pModel->Render();
  m_pDevice->EndScene();
}


kann man das so stehen lassen?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

10.09.2008, 10:55

öhm joa, theoretisch schon, nur praktisch is das ganze nicht :D. man sollte wenn möglich den vertexbuffer einmal erzeugen. z. b. einfach den vertexbuffer bei load erzeugen und füllen und nur setzen im rendern.

Quellcode

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
// Model
Model->Load(/*irgentwas*/)
{
  //-> Daten speichern
  //-> CreateVertexBuffer(/**/);
  //-> VB->Lock(/**/);
  //-> VB->Unlock(/**/);
}

Model->Render(/**/)
{
  //-> SetStreamSource(/**/);
  //-> DrawPrimitive(/**/);
}

// "0815" Dreieck
Dreieck->Create(/**/)
{
  //-> CreateVertexBuffer(/**/);
  //-> VB->Lock(/**/);
  //-> VB->Unlock(/**/);
  //-> Vertices setzen
}

Dreieck->Render(/**/)
{
  //-> SetStreamSource(/**/);
  //-> DrawPrimitive(/**/);
}

// Zeichnen
Render(/**/)
{ 
  m_pDevice->BeginScene();
  m_pDreieck->Render();
  m_pModel->Render();
  m_pDevice->EndScene();
}

7

10.09.2008, 11:05

Ahh :idea: . Jetzt wird mir die sache schon klarer, das kommt davon wenn man zu kompliziert denkt :-).

Nochmal ganz kurz auf die Frage mit den Materialien und den Lichtern, kann ich dann theoretische die Materialien des Models z.B. vor dem SetStreamSource() in der Rendermethode setzen und analog beim Dreieck? Das Licht setze ich dann sozusagen "allgemein", sozusagen bevor die beiden Sachen gerendert werden??

Das ist dann aber auch wirklich die letzte Frage :-)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

10.09.2008, 11:13

Zitat von »"Systematic_Chaos"«

kann ich dann theoretische die Materialien des Models z.B. vor dem SetStreamSource() in der Rendermethode setzen und analog beim Dreieck? Das Licht setze ich dann sozusagen "allgemein", sozusagen bevor die beiden Sachen gerendert werden???


als grundregel kannste dir merken dass da die reihenfolge egal ist, das sind nur werte, die setzt, wenn du dann renderst mit z. b. DrawPrimitive/DrawIndexedPrimitive. Es ist so ziemlich dir überlassen ob du erst material setzt und dann vertexbuffer und danach 5 lichter und dann wieder nen material und dann erst renderst oder keine ahnung wie dir das am sinnvollsten erscheint.

wichtig ist nur, dass du solche aufrufe, wie SetTexture(), SetStreamsource() SetLight() usw. möglichst minimieren solltest und VOR dem Draw-call alles eingestellt ist.

9

10.09.2008, 11:16

Ok, damit hab ich dann alles denk ich. Danke nochmal für die schnelle Hilfe...

Werbeanzeige