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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

29.07.2012, 23:57

Baum-Struktur an OpenCL übergeben

Hat jemand von euch eine Idee, wie man eine Baum-Struktur (z.B. kd-Trees) an OpenCL übergeben kann?
Pointer sind da ja - im Gegensatz zu GLSL, HLSL und Cg (bitte verbessert mich, fals das nicht stimmt) - erlaubt.
Also sollte das ja auch grundsätzlich möglich sein.

Ich will meinen LightmapGenerator mit OpenCL aufrüsten. Aber ich glaube das hätte wenig Sinn, wenn ich in OpenCL keine Baumstruktur für die Kollisions-Erkennung verwenden könnte und immer alle Dreiecke durchlaufen müsste.
Bei Brute-Force bringt auch die beste Grafikkarte nichts.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

30.07.2012, 00:36

Dafür brauchst du keine Pointer. Es reicht, wenn du einfach Indizes abspeicherst. Also z.B. so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct KDNode
{
    int axis;
    float split;
    bool leaf;

    // Für innere Knoten (!leaf)
    int frontChildIndex; // Index des vorderen Kindknotens
    int backChildIndex; // Index des hinteren Kindknotens

    // Für Blätter (leaf)
    int firstTriangleIndex; // Index des ersten Dreieck im Knoten
    int numTriangles; // Anzahl der Dreiecke im Knoten
};

Und dann einfach ein Array aus diesen Strukturen.
Separat davon ein Array, wo alle Dreiecke drin sind.

Willst du Raytracing implementieren?

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

3

30.07.2012, 00:42

Du kannst - genauso wie auf CPU-Seite - die Baum-Struktur in einem Array speichern. Allerdings sind eigene Datentypen eher langsamer als die Standarddatentypen, von daher solltest Du überlegen, ob Du deine Baumdaten nicht in einer vec4 oder ähnliches kodieren kannst. Die Speicherzugriffe auf den Baum wirst Du nur suboptimal hinbekommen, da Du "zufällig" durch den Speicher läufst.
Auf der GPU kannst Du mit OpenCL dein Array über Pointer ansprechen und den Baum "normal" verwenden. Wenn Du die Daten aber lokal eingrenzen kannst, könntest Du die Zugriffe optimieren.
Das gleiche funktioniert auch mit GLSL, dort kodierst Du dein Array in 1- oder 2-dimenionales Bild. Das 1D-Bild wurde extra für solche Einsatzzwecke gemacht, aber ich weiß nicht, ab welcher GL-Version (3.1?) es verfügbar ist. Zumindest rechnest Du dann deinen Index in Texturkoordinaten um.
HLSL und Cg habe ich noch nie für Berechnungen oder ähnliches missbraucht, aber da sollte es ähnlich gehen.

Kleine Warnung: Mit OpenCL kann optimieren deutlich anstrengender sein, die Grafiksprachen verstecken einige Eigenheiten...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

4

30.07.2012, 11:55

Ok danke das probier ich mal.
RayTracing mit GLSL hatte ich ja schon mal ansatzweise gemacht. Diesmal will ich das aber für Lightmap-Generierung verwenden - also natürlich auch Kollisions-Erkennung wie beim RayTracing, aber das Resultat ist anders.

Werbeanzeige