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

14.01.2010, 18:28

Picking mit Shadern, nur wie?

Hi,
ich hatte letztes Jahr mal ein paar EMails an die Firma Kalypsomedia geschrieben und die waren dort auch sehr freundlich und haben mir sogar verraten, dass sie alles mit Shadern machen, sogar das Picking.
Und nun frage ich mich, wie um alles in der Welt kann man nur das Picking mit den Shadern machen?
Vermutlich über die Vertex Shader aber ich hab kein blassen Dunst wie das genau gehen soll.
Ich habe ja bisher in meiner 3D Engine den Line-Triangle-Intersection Test und die 3D Linie geht von der Kamera aus zu dem Punkt, wo man z.B. mit dem Cursor hinzeigt. Das funktioniert sehr gut, aber ich würde das gerne mit Shadern beschleunigen, also quasi GPGPU. Bisher habe ich das nur mit OctTrees (oder Octree) optimiert, was auch schon einiges ausmacht.
Kann mir da jemand was genaueres zu sagen?

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

2

14.01.2010, 18:55

Ich könnte mir z.B. vorstellen, dass man die gesamte Szene in ein MRT rendert, eines der Targets (oder mehrere) davon dann die tatsächlichen Farbwerte enthalten, eines jedoch ein falschfarbenes, wobei jedes Objekt eine andere Farbe hat. Dann braucht man nur noch die Farbe unter dem geklickten Punkt in diesem extra Render Target zu bestimmen. Damit spart man sich schonmal jegliche redunante Vertextransformationen. Außerdem hat der eigentliche Test dann eine Komplexität von 1, egal wie viele Objekte in deiner Szene sind.
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

14.01.2010, 19:10

Re: Picking mit Shadern, nur wie?

Zitat von »"LukasBanana"«

Und nun frage ich mich, wie um alles in der Welt kann man nur das Picking mit den Shadern machen?


Naja muss irgendwas GPGPU mäßiges sein, wie genau die das machen bleibt aber fraglich. Dazu müsste man mal wissen machen die das mit d3d 10 oder 9 (also verwenden sie z.B. Stream Output und Geometry Shader) etc. Überlegen kann man sich auf jeden Fall was (z.B. pro Dreieck einen Vertex machen und dann im VertexShader den Test). Die größte Frage is für mich wie man am Besten das Ergebnis zurück zur CPU bringt. Da kann man natürlich alles mögliche machen, Farbkodierten output etc.
Die Sinnhaftigkeit des ganzen is würd ich aber mal in Frage stellen, weil das alles schon nen ordentlichen overhead mit sich bringt. Wenn man nicht gerade unglaubliche Mengen an Dreicken testen muss wär ich mir nicht so sicher dass die GPU einem da ne große Hilfe is...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

14.01.2010, 19:13

Zitat von »"the[V«

oid"]Ich könnte mir z.B. vorstellen, dass man die gesamte Szene in ein MRT rendert, eines der Targets (oder mehrere) davon dann die tatsächlichen Farbwerte enthalten, eines jedoch ein falschfarbenes, wobei jedes Objekt eine andere Farbe hat. Dann braucht man nur noch die Farbe unter dem geklickten Punkt in diesem extra Render Target zu bestimmen. Damit spart man sich schonmal jegliche redunante Vertextransformationen. Außerdem hat der eigentliche Test dann eine Komplexität von 1, egal wie viele Objekte in deiner Szene sind.


Das is natürlich auch eine Möglichkeit, dazu muss man aber halt das ganze Rendertarget über den Bus schicken und es wird evtl. immer gerendert auch wenn gar nicht gepicked wird. Hat ansonsten aber natürlich mehrere Vorteile, man bekommt immer den nähesten Schnittpunkt und rendern muss man sowieso. Erfordert aber natürlich dass praktisch alle Shader entsprechend angepasst sind...wobei naja gut das könnte man auch im Rahmen eines z-Prepass erledigen.

Ich denke inwiefern das Sinn macht muss man sich für eine konkrete Anwendung anschauen...

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

14.01.2010, 19:37

Zitat von »"dot"«

Das is natürlich auch eine Möglichkeit, dazu muss man aber halt das ganze Rendertarget über den Bus schicken und es wird evtl. immer gerendert auch wenn gar nicht gepicked wird.


Das zusätzliche Rendering wäre ja das kleinste Problem, denke ich mal. Und zurück über den Bus: Wird da wirlich die gesamte Textur wieder zurückbefördert, auch wenn man nur einen bestimmten Bereich anfordert? Kann ich mir ja kaum vorstellen. Warum sollte da nicht genau der Pixel zurückgeschickt werden, den man anfordert?
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

14.01.2010, 20:11

Natürlich ist das rendern evtl. kein allzugroßes Problem und es wird wenn man es richtig macht sinnvollerweise nur ein Teil zurückgeschickt, das stimmt schon. Einen gewissen Overhead stellt das ganze dennoch dar und die Frage ist halt ob man mit der CPU wirklich langsamer ist, denn da kann man mit der richtigen Datenstruktur auch recht schnell sein. Frustrum Culling wird man sowieso machen und ob man dann n paar tests auf der CPU macht oder das ganze auf die GPU auslagert wird keinen so großen Unterschied machen denk ich. Es hängt, wie gesagt, aber natürlich von der konkreten Anwendung ab.

7

14.01.2010, 21:38

Also Picking ist doch eigentlich etwas, was man höchstens einmal pro Frame macht (gut, es gibt vielleicht ausnahmen, aber in der Regel geschieht es nunmal nicht oft).
Ich glaube kaum, das es Sinn macht, dafür Shader zu benutzen. Vor allen Dingen müsste man ja alles mit Farben und so rendern, und dann noch für jedes Objekt in der Szene eindeutige Farben generieren und und und.
Außerdem braucht man ja eh für z.B. jeden Schuss einen Strahl/Szene Test, wenn man den dann noch grad einmal fürs Picking benutzt, das fällt gar nicht auf.
Insgesamt halte ich das ganze also für keine gute oder performante Idee, außerdem ist der Implementierungsaufwand ja recht hoch, ich würds sein lassen.
Lieber dumm fragen, als dumm bleiben!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

14.01.2010, 21:58

Wenn man das wirklich so macht, dass man jedem Objekt eine eindeutige Farbe gibt und dann rendert: man muss natürlich nicht auf den ganzen Frame-Buffer zugreifen. Man Lock()t einfach nur ein Rechteck, das nur diesen einen Pixel enthält.
Ich glaube auch nicht, dass das viel Sinn macht. Es hat den Vorteil, dass man sich eine zusätzliche Datenstruktur speziell für Picking sparen kann.
Es könnte vielleicht was bringen, wenn der Benutzer durch eine komplexe Auswahlmaske einen Bereich auswählen kann, und man wissen möchte, welche Objekte in diesem Bereich liegen.

Werbeanzeige