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

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

04.02.2018, 15:29

Geometry-Shader Logik-Fehler?

Moin, ich habe gestern in einem Buch ein Geometry-Shader-Beispiel gefunden.
Es geht darum ein Dreieck in vier Dreiecke zu zerteilen, indem man auf der Mitte der Seiten jeweils ein Vertex hinzufügt.
Soweit so simpel, aber aus irgendeinem Grund wird die berechnete Position des neuen Vertices normalisiert und dann als Normale verwendet.

Ich meine eine Position zu normalisieren macht (zumindest hier) wenig Sinn, weil es die Position ja verfälscht. Geometrisch projiziert er die Position auf den Einheitskreis um den lokalen Ursprung.
Macht für mich nur Sinn, wenn 0,0,0 im Dreieckszentrum ist und der Inkreis einen Radius von 1 hat. Aber selbst dann ist das ja unnötig, die Berechnung hat den Punkt doch schon an der richtigen Position.

Dazu kommt noch die Normale, die genau dieser Position entspricht. Ich hätte die einfach interpoliert (und dann normalisiert), aber so macht das für mich wieder keinen Sinn. Der lokale Ursprung ist wahrscheinlich in der Dreiecksebene, das würde die Normale hier dann zu einer Tangente machen, wenn man wirklich die vorhin berechnete Position nimmt.

Also übersehe ich da etwas, oder handelt es sich um einen Fehler im Buch?

(Hier ein Ausschnitt)

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void Subdivide(VertexOut inVerts[3], out VertexOut outVerts[6])
{
 // Position im local space, normale (local) und texcoords
 VertexOut m[3];

 // Punkte auf den Seitenmitten des Dreiecks...
 m[0].PosL = 0.5f*(inVerts[0].PosL+inverts[1].PosL);
 // entsprechend mit den anderen Punkten (ausgeblendet)

 // Project onto unit sphere (Originalkommentar)
 m[0].PosL = normalize(m[0].PosL);
 // etc.

 // Deriving normals (Originalkommentar)
 m[0].NormalL = m[0].PosL;
 // etc.

 outVerts[0] = inverts[0];
 outVerts[1] = m[0];
 outVerts[2] = m[1];
 outVerts[3] = m[2];
 outVerts[4] = inverts[1];
 outVerts[5] = inverts[2];
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.02.2018, 16:17

Hängt wohl davon ab, was genau der Sinn des Geometry Shader sein soll. Position normalisieren macht genau dann Sinn, wenn du eine Kugel rendern willst, denn damit platzierst du den unterteilten Vertex auf der Kugeloberfläche... ;)

Abgesehen davon würde man für sowas natürlich Tessellation verwenden, Geometry Shader sind für diesen Zweck gänzlich ungeeignet...

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

04.02.2018, 18:27

Der Zweck war halt, ein Dreieck zu unterteilen, und es wurde nichts von Kugel erwähnt xD (außer im Kommentar).

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

04.02.2018, 19:03

Wenn du das Dreieck unterteilst, musst du den neuen Punkten ja irgendwelche sinnvollen Koordinaten geben. Wenn die genau im alten Dreieck liegen, ist die Unterteilung relativ sinnlos, weil sich die Geometrie dann nicht ändert (es bleibt ein Dreieck, nur eines mit unnötig vielen Eckpunkten). Vielleicht funktioniert der Shader für die konkreten Eingabedaten, die er im Beispielprogramm bekommt, und dann sieht man, wie aus dem Dreieck langsam etwas Kugelartiges wird, je stärker man es unterteilt.

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

04.02.2018, 21:24

Hm das kann natürlich sein, wurde dort aber nicht weiter ausgeführt. War einfach nur ein Beispiel um das zu verdeutlichen. Danke für eure Antworten.

Werbeanzeige