Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 23:25

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Instancing
BeitragVerfasst: So Aug 02, 2009 02:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Moin!

Ich habe mal eine Frage aus reinem Interesse, da ja jetzt von CoolCat die Instance-Geschichte ins Wiki eingeführt wurde. Was genau geschieht beim Instancing auf der Grafikkarte und kann mir jemand ein Beispiel geben, was man damit anstellen kann? Im großen und ganzen weiß ich halt, dass man damit einen Berg von ähnlichen/gleichen Geometrien zeichen kann, aber wie genau müsste man das anstellen und wie weit ist das dann nützlich?

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 02, 2009 10:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Was genau geschieht beim Instancing auf der Grafikkarte

Ich kopiere einfach mal den Pseudocode zu glDrawArraysInstancedARB aus dem Artikel. Im wesentlichen ist das ganze nichts weiter als eine for-Schleife um ein glDrawArrays. Die Schleife läuft halt auf der Grafikkarte und du kannst im Shader via gl_InstanceIDARB auf den Schleifen-Index zugreifen:
Code:
  1. procedure glDrawArraysInstancedARB(mode: TGLenum; first: TGLint; count: TGLsizei; primcount : TGLsizei)
  2. begin
  3.     if (mode or count is invalid) then begin
  4.         generate appropriate error
  5.     end
  6.     else begin
  7.         for i := 0 to primcount-1 do begin
  8.             gl_InstanceIDARB := i;
  9.             glDrawArrays(mode, first, count);
  10.         end;
  11.         gl_InstanceIDARB := 0;
  12.     end;
  13. end;
  14. //(ich hoffe ich habe die Delphi/Pascal-Syntax so halbwegs getroffen...)


Zitat:
und kann mir jemand ein Beispiel geben, was man damit anstellen kann?

Ok, nehmen wir mal an du willst bei einem Partikelsystem statt gewöhnlichen PointSprites einfach mal Kugeln, oder vielleicht auch kleine Steine rendern. Du würdest nun einen VBO erzeugen der eben eine Kugel bzw. einen Stein enthält und diesen wie folgt rendern:

Code:
  1. glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
  2. ...
  3. glDrawArraysInstancedARB(GL_TRIANGLES, 0, m_faces*3, m_anzahlPartikel);


Das alleine bringt jetzt erstmal nicht soviel, da alle Objekte mit der gleichen ModelView-Matrix transformiert werden. Im Vertexshader erzeugst du nun abhängig von gl_InstanceIDARB für jedes Objekt eine eigene ModelView-Matrix. Im Falle der Partikel würde man die Partikelpositionen bespielsweise als TBO (=TextureBufferObject) an den Shader übergeben. Ein TBO ist nichts weiter eine eindimensionale Textur auf die du mit Integer-Texcoords zugreifen kannst. Es findet also keine Interpolation zwischen den Texeln statt => schneller. Desweiteren darf so ein TBO auch wesentlich größer als eine 1D-Textur sein. Letztlich könnte man aber natürlich auch eine normale Textur verwenden.

So ein Shader könnte etwa so aussehen:
[glsl]#extension GL_EXT_gpu_shader4 : enable
#extension GL_ARB_draw_instanced: enable

uniform samplerBuffer tboPosition; // TextureBufferObject

void main() {
vec4 translation = texelFetchBuffer(tboPosition, gl_InstanceIDARB);
vec4 position = gl_Vertex + translation;
gl_Position = gl_ModelViewProjectionMatrix * position;

// Normale, Texcoords usw. auch noch richtig setzen...
}[/glsl]

Ich hatte übrigens vor in den nächsten Tagen irgendwann noch einen Artikel "Instancing" zu erstellen wo eben ein solches Beispiel drin ist.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 02, 2009 10:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ein weiterer Anwendungsfall wären z.B. Bäume oder Grasbüschel auf einem Terrain.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 02, 2009 11:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Oder Dominos :) : http://www.humus.name/index.php?page=3D&ID=72


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 13, 2009 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich hatte übrigens vor in den nächsten Tagen irgendwann noch einen Artikel "Instancing" zu erstellen wo eben ein solches Beispiel drin ist.

So, ich habe meine Drohung mal war gemacht...
http://wiki.delphigl.com/index.php/shader_Instancing

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 14, 2009 08:47 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Vielen Dank für das ausführliche Beispiel! Das hat mir das Thema jetzt gut verdeutlicht. Mal sehen ob ich demnächst mal dazu komme das auszuprobieren.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.019s | 15 Queries | GZIP : On ]