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];
}
|