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

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

11

27.01.2010, 16:16

Müsste bei einer flachen Fläche bei der alle Y-Werte der Vertices den gleichen Wert haben, der Tangent-Vektor nicht einen Y-Wert von 0 haben?

LG
Alyx

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

12

27.01.2010, 16:18

Flächen sind immer flach ;) Die Fläche liegt ja schräg im World-/Viewspace, sonst könnte man sie garnicht sehen.
Somit muss die Tangente (im World-/Viewspace) auch einen Y-Anteil ungleich 0 haben.
Die Y-Anteile der Vertex-Koordinaten sind ja nur im Objectspace alle gleich.


EDIT: Den wert der Vertex-Normalen hab ich nun auch überprüft.
<< an dieser Stelle ist eine Signatur verstorben >>

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

13

27.01.2010, 16:33

Ich meinte mit dem "flach" flach am "Boden" :-). Ok, ich dachte die Kamera wäre gekippt und nicht die Fläche. Ich meld mich heute Abend mal, wenn ich am eigenen PC sitze, dann kann ich vergleichen wie's aussehen sollte, hier grad keinen Quelltext vor Augen.

LG
Alyx

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

14

27.01.2010, 18:43

Also um es nochmal auf den Punkt zu bringen, hab das grade nochmal überprüft:

Sowohl die Normalvektoren stimmen, als auch die Lichtvektoren, aber das Punktprodukt aus beiden nicht.
Wie kann das Sinn machen?
Oder muss man etwa für die Diffuse-Beleuchtung einen anderen Term verwenden als diffuse_color * dot( normal, light_direction ) * attenuation?

Dabei 'stehen' normal und light_direction auf demselben Pixel und zeigen von ihm weg.
<< an dieser Stelle ist eine Signatur verstorben >>

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

15

27.01.2010, 19:37

Hast du das mal auf einer anderen Grafikkarte probiert ?
Bei OpenGL verläßt du dich ja auch sehr auf die Hardware.

Ich kenne genug Fälle, wo sich die Verwendung von OpenGL gerächt hat.
Insbesondere ATI hat sich in den letzten Jahren bei OpenGL nicht mit Ruhm bekleckert.

-->Treiber-Update(Downgrade) hilft übrigens auch oft.

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

16

27.01.2010, 22:00

So... hab mich grad mal wieder reingelesen und poste gleich ein paar Grafiken...

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

17

27.01.2010, 22:14

So:


(Link)


Quellcode

1
bump = normalize( texture2D(normalMap, vsOutTexCoord0).xyz * 2.0 - 1.0);


Normal-Vector direkt berechnen:

Quellcode

1
2
3
vec3 ReflNormal = vec3( bump.z * vsOutNormal.x + bump.x * vsOutTangent.x + bump.y * vsOutBinormal.x,
bump.z * vsOutNormal.y + bump.x * vsOutTangent.y + bump.y * vsOutBinormal.y,    
bump.z * vsOutNormal.z + bump.x * vsOutTangent.z + bump.y * vsOutBinormal.z );


Diffuse-Berechnung:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    void CalculateLightVsDot(int CL)
    {
        #if DIRECT_LIGHT==1
            #define intensity 1.0
            vec3 L = normalize(gl_LightSource[CL].position.xyz);            
        #else
            // direction position -> light
            vec3 lightDir   = gl_LightSource[CL].position.w==0.0 ? gl_LightSource[CL].position.xyz: gl_LightSource[CL].position.xyz - vsOutPositionMV;
            // intensity decrease through distance
            float intensity = gl_LightSource[CL].position.w==0.0 ? 1.0 : 1.0/(gl_LightSource[CL].constantAttenuation+(lightDir.x*lightDir.x+lightDir.y*lightDir.y+lightDir.z*lightDir.z)*gl_LightSource[CL].quadraticAttenuation);
            // normalize light dir
            vec3 L          = normalize(lightDir);
        #endif

    #if NORMAL_MAP==1
        vec3 lightVec;
        lightVec.x = dot(L, vsOutTangent);
        lightVec.y = dot(L, vsOutBinormal);
        lightVec.z = dot(L, N);

        // float lambertTerm = dot(N,L);
        float lambertTerm = max( dot(lightVec,bump), 0.0);  

        float side = dot(L,N);
    #else   // of normal map
        float lambertTerm = dot(L,N);
        float side = lambertTerm;
    #endif  // of no normal map

        diffuse += gl_LightSource[CL].ambient.xyz*intensity;

        #if NORMAL_MAP==1
            float scale;

            if ( side<0.0 )
            {           
                scale = clamp(1.0+side*5.0,0.0,1.0);
                float da = dot(vec3(0.0,0.0,1.0),bump);
                diffuse += vec3(da,da,da)*0.01;
            }
            else
                scale = 1.0;
        #endif

        if(lambertTerm > 0.0)
        {
            #if NORMAL_MAP==1
                diffuse += gl_LightSource[CL].diffuse.xyz * gl_FrontMaterial.diffuse.xyz * lambertTerm * intensity * scale; 
            #else
...

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

18

28.01.2010, 00:10

Die Vektoren habe ich anbei alle mit *0.5+vec(0.5,0.5,0.5) dargestellt, damit man auch die negativen Werte sehen kann, bevor es zur Verwirrung führt. :-)

LG
Alyx

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

19

28.01.2010, 11:49

Dankeschön für deine Mühen, Alyx, aber wirklich weitergeholfen hat mir das leider nicht.

Allerdings habe ich mir die Normalen nochmal angeschaut und bin da nun doch auf nen Fehler gestoßen.

Man beachte, alle Normalen liegen im World-/Viewspace.
Hier das Rendering der x-Komponenten der Normalen:


(Link)


Und das Rendering der y-Komponenten:


(Link)


Und zuletzt auch der z-Komponenten:


(Link)


Irgendwie ist da doch überall ein 'Dreher' drin, oder?
Auf dem Bild der x-Komponenten z.B. würde ich erwarten, dass an Stelle der unteren linken Kante die obere rechte Kante hell ist.
Beim Bild der y-Komponenten hätte meiner Meinung nach ebenso die obere rechte Kante hell sein sollen, aber nicht die linke untere.
Beim Bild der z-Komponenten erkennt man leider nicht viel.
Legt man es aber über ein Bild der Punktprodukte drüber, wird deutlich, dass hier beiden linken Kanten (oben und unten) dunkel markiert sind.
In meinen Augen hätten es aber die beiden oberen (links und rechts) sein sollen.

Liege ich in diesen Annahmen richtig?
Was könnte so einen 'Dreher' verursachen?
Hab grad leider keine Zeit mehr dem Problem auf den Grund zu gehen, aber heut Abend gehts weiter... :roll:
Ich vermute einen Fehler bei der Tangentenberechnung (auch wenn ich diese schon x mal überprüft habe), werde dann mal etwas damit herumspielen.

Vielen Dank im Voraus
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

28.01.2010, 12:21

Ich sagte ja schon dass ich denke dass deine Tangente in die falsche Richtung zeigt, schau mal was rauskomm wenn du sie umdrehst.

Ansonsten kann ich zu den Bildern nicht viel sagen weil ich keine Ahnung hab was da genau wie im Raum liegt (z.b. welche Punkte haben welche Texcoords etc.)

Werbeanzeige