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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

17.10.2009, 13:10

Zitat von »"E122"«

Aber wo liegt der Fehler ? oder Besserer Vorschlag als Dots methode ?
Ich will jetzt mal weiterkommen. Dieses Normalmapping nervt mich schon seit 3 Tagen :evil: :cry:


Ich hab dir oben einige Links gepostet. Da wird alles im Detail erklärt. Falls du was nicht verstehst kannst du ja gern nachfragen.

12

17.10.2009, 14:37

Ich versteh irgendwie nicht so recht, wie die Tangente genau definiert ist.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

17.10.2009, 15:24

Zitat von »"E122"«

Ich versteh irgendwie nicht so recht, wie die Tangente genau definiert ist.


Grob gesagt ist der Tangentialraum einfach ein weiterer Raum der dir das Leben leichter machen soll. :-) Für jeden Vertex wird eine Menge von 3 Basisvektoren angegeben, die den Raum aufspannen (die Basis wird dann über die Oberfläche interpoliert). Die Idee ist die Oberflächennormalen losgelöst von der Geometrie und ggf Spiegelung/Rotation/... dieser zu hinterlegen - also relativ zum (interpolierten) Tangentialraum der Vertices. Als netten Nebeneffekt kann man Tangentspace-Normalen meist besser komprimieren (alle Vektoren liegen ja auf der Einheitshemisphäre vor der Oberfläche).
Was du also tun musst ist für jeden Vertex das Basisset zu finden (d.h. erstmal für jedes Dreieck, danach richtest du die Vektoren für jeden Vertex aus). Sobald du die Basen hast kannst du Vektoren zwischen Objektspace und Tangentspace transformieren.

14

17.10.2009, 20:07

Das Normalmapping scheint zu funktionieren.

Aber stimmt das wirklich so ? dieser Ansatz/Wert der Tangente scheint mir irgendwie zu einfach.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for (int i = 0; i< 2; i++)
        {
            // Berechnen:

            //

            tbVector3 v0 (v[i*3+0].Position);
            tbVector3 v1 (v[i*3+1].Position);
            tbVector3 v2 (v[i*3+2].Position);

            // DeltaA und DeltaB berechnen

            tbVector3 DeltaA (v1 - v0);
            tbVector3 DeltaB (v2 - v0);

            //

            float du0 (v[1*3+1].Texture.u - v[1*3+0].Texture.u);
            float du1 (v[1*3+2].Texture.u - v[1*3+0].Texture.u);

            // Vektoren berechnen

            tbVector3 Tangent (tbVector3Normalize (DeltaA));

            v[i*3+0].Tangent = Tangent;
            v[i*3+1].Tangent = Tangent;
            v[i*3+2].Tangent = Tangent;
        }


im Shader

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Outpt.Tangent = normalize (mul (Tangent, (float4x3) WorldMatrix));
    Outpt.Binormal = cross (Tangent, Outpt.Normal);

und

        float3 Noram = tex2D (NormalSampler, TextureCoords);
        Normalxx = TransformToWorldSpace(Noram, Normal, Tangent, Binormal);

bei

float3 TransformToWorldSpace (float3 Vector, float3 Normal, float3 Tangent, float3 Binormal)
{
    return mul(Vector, float3x3(Tangent, Binormal, Normal));
}
[/cpp]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

17.10.2009, 20:34

Du nimmst als Tangentialvektor einfach die eine Kante des Dreiecks... Wieso?

C-/C++-Quelltext

1
2
float du0 (v[1*3+1].Texture.u - v[1*3+0].Texture.u);
float du1 (v[1*3+2].Texture.u - v[1*3+0].Texture.u); 


Die Indizierung ist hier falsch. Da du du0 und du1 aber sowiso nicht weiter versendest fällts wohl nichts auf.

Aber:

Zitat von »"E122"«


Das Normalmapping scheint zu funktionieren.


wenn alles so funktioniert wie gewünschst, wieso bist du dir nicht sicher, dass alles stimmt?

16

17.10.2009, 20:48

Ich checks immer noch nich. Ist der tangentialvektor denn nicht die Kante des Dreiecks. Diese ist ja einer der Basisvektoren für das Tangent-Space.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

17.10.2009, 20:54

Zitat von »"E122"«

Ich checks immer noch nich. Ist der tangentialvektor denn nicht die Kante des Dreiecks. Diese ist ja einer der Basisvektoren für das Tangent-Space.


Geh eine Seite zurück. Im 2. Post hab ich einige Links gepostet die das ausführlich erklären, scheinbar hast du dir noch nicht die Zeit genommen dich mal gründlich mit der Materie auseinanderzusetzen.

18

17.10.2009, 20:56

Ich hab grad entdeckt, dass es ja auch die Vertex-Shader input semantic TANGENT gibt. Ist diese denn auch gültig ? Dann bräuchte man ja keine Tangenten mehr berechnen ?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

19

17.10.2009, 21:05

Und woher sollen die Werte kommen?

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

20

17.10.2009, 23:05

aus einem shaderX buch:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
float3x3 HawkFrame_TangentSpace(float3 _normal, float3 _position, float2 _texCoords)
{
    // Get edges

    float3 edgeFaceA = ddx(_position);
    float3 edgeFaceB = ddy(_position);
    float2 uvEdgeA = ddx(_texCoords);
    float2 uvEdgeB = ddy(_texCoords);

    // Calculate tangent and bitangent

    float2x3 m = float2x3(edgeFaceA, edgeFaceB);
    float3 tangent = mul(float2(uvEdgeA.x, uvEdgeB.x), m);
    float3 bitangent = mul(float2(uvEdgeA.y, uvEdgeB.y), m);

    //Build tangent frame

    float maxL = max(length(tangent), length(bitangent));
    return float3x3(tangent / maxL, bitangent / maxL, _normal);
}

berechnet die tangente und bitangente im shader. geht ganz gut und vermindert die größe der zu übertragenen daten, da die beiden tangenten im shader berechnet werden....
evtl hilft es dir ja ;)

Werbeanzeige