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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

31

05.12.2011, 09:38


(Link)


Also auf der Y-Achse passt es... Aber ich versteh nicht warum der das Licht so stark versetzt anzeigt. Außerdem sieht die Lichtquelle über Kanten oder Ecken der Bodenflächen unterschiedlich aus.

HV wird jetzt so berechnet:

C-/C++-Quelltext

1
HV = (L-pos.xyz)/2;


Kann man pos und lightPos überhaupt vergleichen wenn sie in unterschiedlichen Koordinatensystemen sind?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

32

05.12.2011, 18:29

Ich seh schon, ihr seit genauso Ratlos wie ich. Aber warum funktioniert das bei allen so einfach: klick

Wenn man sich das mal anguckt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // Get surface normal in eye coordinates
    vVaryingNormal = normalMatrix * vNormal; // MACH ICH GENAUSO

    // Get vertex position in eye coordinates
    vec4 vPosition4 = mvMatrix * vVertex; // MACH ICH GENAUSO
    vec3 vPosition3 = vPosition4.xyz / vPosition4.w; // BRINGT NIX, w IST EH 1

     //get distance to light source
     dist=length(vLightPosition-vPosition3); // GENAU DAS GLEICHE, vLightPosition WIRD NIEMALS MIT IRGENDEINER MATRIX MULTIPLIZIERT!!!

    // [...]

    // Get vector to light source
    vVaryingLightDir = normalize(vLightPosition - vPosition3); // HATTE ICH SO VOR, WIEDER: KEINE MATRIX!!!


Also, was soll ich jetzt glauben oder tun? Könnt ihr verstehen das ich etwas verwirrt bin? Vor allem wird überall gesagt:

Unterschied zum directionalen Licht:

1. Hat die w Komponente (woher soll ich die z.B. bekommen? Wenn ich sie nicht habe?)
2. Hat attenuation (hab ich ja auch)

Und mein directionales Licht funktioniert. Wenn ich also diese 2 Punkte befolge, die auch auf Lighthouse und sonst wo stehen, stimmt das Ergebnis nicht.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

33

05.12.2011, 20:08

ICH LAUF AMOK! Es funktioniert! :thumbsup:

Und mal wieder habe ich bewiesen das nur ich meine Probleme lösen kann und gleichzeitig was für ein Troll ich bin:

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
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// VERTEX

uniform mat4 object_projection;
uniform mat4 object_modelview;
uniform mat3 object_normal_modelview;
uniform mat4 light_modelview;

uniform Material material0;
uniform Light light0;

in vec3 a_Vertex;
in vec2 a_TexCoord;
in vec3 a_Normal;

out vec2 texCoord;
out vec4 V;
out vec3 N;

void main(void){        
    V = object_modelview*vec4(a_Vertex, 1.0);
    N = normalize(object_normal_modelview*a_Normal);
    
    texCoord = a_TexCoord;
    gl_Position = object_projection*V;
}

// FRAGMENT

uniform mat4 light_modelview;

uniform sampler2D texture0;
uniform Material material0;
uniform light light0;

in vec2 texCoord;
in vec4 V;
in vec3 N;

out vec4 color;

void main(void){
    vec3 n = normalize(N);
    vec3 v = normalize(vec3(V));

    vec3 L = vec3(light_modelview*vec4(1.0)-V); // <----- man beachte meine Dummheit
    float distance = length(L);
    L = normalize(L);
    vec3 HV = (L-v)/2;

    color = material0.ambient*light0.ambient;

    float NdotL = max(dot(n, L), 0.0);
    
    if(NdotL > 0.0){
        float attenuation = 1.0/(light0.constant_attenuation+ 
                                 light0.linear_attenuation*distance+ 
                                 light0.quadratic_attenuation*distance*distance);
        
        float NdotHV = max(dot(n, normalize(HV)), 0.0);
        color += material0.emissive+
                 material0.diffuse*light0.diffuse*NdotL*attenuation+
                 material0.specular*light0.specular*pow(NdotHV, material0.shininess);
    }
    
    color *= texture(texture0, texCoord.st);
}


Wenn ich eine Matrix benutzt um das Licht zu verschieben, warum zur Hölle multipliziere ich dann noch die Position des Lichts mit dieser Matrix??? Das ist zwar noch nicht super Optimal jetzt, sieht aber so aus (ich will nur noch die Position übergeben, keine extra Matrix):


(Link)


Wie man sieht ist das beschissene Licht jetzt endlich da wo es sein soll.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

34

06.12.2011, 17:34

So, ich geh euch mal wieder auf den Sack:


(Link)


Ich wüsste gerne warum das Modell dort beleuchtet ist. Das Licht geht vorbei. Ist die Lichtrichtung im richtigen Koordinatensystem? Shader:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Vertex wie gehabt

// Fragment:

// [...]

void main(void){
    vec3 n = normalize(N);
    vec3 v = normalize(vec3(V));

    vec3 L = vec3(camera_modelview*light0.position-V);
    float distance = length(L);
    L = normalize(L);
    vec3 HV = (L-v)/2;

    color = material0.ambient*light0.ambient;

    float NdotL = max(dot(n, L), 0.0);
    
    if(NdotL > 0.0){
        float spot = dot(normalize(vec3(camera_modelview*light0.direction)), -L); // <---- entscheident, richtig?
        
        if(spot > light0.cutoff){
            spot = pow(spot, light0.spot);

            float attenuation = spot/(light0.constant_attenuation+ 
                                      light0.linear_attenuation*distance+ 
                                      light0.quadratic_attenuation*distance*distance);
        
            float NdotHV = max(dot(n, normalize(HV)), 0.0);
            color += material0.emissive+
                     material0.diffuse*light0.diffuse*NdotL*attenuation+
                     material0.specular*light0.specular*pow(NdotHV, material0.shininess);
        }
    }
    
    color *= texture(texture0, texCoord.st);
}


Was noch zu sagen währe:

Daten Licht: vec3(10, 0, 10), vec3(-0.5, -0.4, 1), 0.99, 2 (Position, Richtung, Cutoff [Kegel], Exponent für pow())
Daten Modell: vec3(5, 5, 5), -90, 0, 180, 4 (Position, Rotation [x, y, z], Skalierung)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

35

06.12.2011, 18:29

Sicher, dass der Lichtkegel am Model vorbei geht? Für mich sieht das Bild auf den ersten Blick ok aus, allerdings es es schwer zu sagen in der Perspektive. Zeichne doch einfach den Lichtkegel als Debuggeometrie, dann siehst du viel eher ob dein Shader stimmt.
@D13_Dreinig

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

36

06.12.2011, 19:14

Ok in dem Bild ist das etwas schwer zu sehen, allerdings kann der Lichtkegel auch hinter dem Objekt sein (also Kugel über dem Kopf) und dann wird das Modell beleuchtet.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

37

07.12.2011, 17:39

So hier nochmal genauer was ich meine:


(Link)


Shader:

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
24
25
26
27
28
29
30
31
32
33
34
// Fragment

void main(void){
    vec3 n = normalize(N);
    vec3 v = normalize(vec3(V));

    vec3 L = vec3(camera_modelview*light0.position-V);
    float distance = length(L);
    L = normalize(L);
    vec3 HV = (L-v)/2;

    color = material0.ambient*light0.ambient;

    float NdotL = max(dot(n, L), 0.0);
    
    if(NdotL > 0.0){
        float spot = dot(normalize(vec3(camera_modelview*light0.direction)), -L);
        
        if(spot > light0.cutoff){
            spot = pow(spot, light0.spot);

            float attenuation = spot/(light0.constant_attenuation+ 
                                      light0.linear_attenuation*distance+ 
                                      light0.quadratic_attenuation*distance*distance);
        
            float NdotHV = max(dot(n, normalize(HV)), 0.0);
            color += material0.emissive+
                     material0.diffuse*light0.diffuse*NdotL*attenuation+
                     material0.specular*light0.specular*pow(NdotHV, material0.shininess);
        }
    }
    
    color *= texture(texture0, texCoord.st);
}

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

38

07.12.2011, 19:21

Ok vergesst es, ich hab bloß vergessen das Licht mal nach 1, 0, 0 statt 1, -0.5, 0 auszurichten um zu sehen ob es richtig ist. Ich Vogel ^^
Naja immerhin können andere diesen Shader jetzt finden und benutzen.

Werbeanzeige