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

1

04.09.2012, 16:06

Diffuse Term berechnen

Hallo,

ja ich weiß ich war an diesem Punkt schonmal, allerdings ist mir etwas Quellcode verloren gegangen *hust* und aus meinen alten Themen kann ich das ganze nicht mehr zusammen zimmern.
Also, ich habe Probleme den diffuse Term für ein directional light zu berechnen. In den ganzen Tutorials und Foren die so im Internet rumfliegen findet man allerdings nichts "einheitliches". Z.B. wird gesagt das der Lichtvektor in den View Space gebracht werden muss, andere sagen dies sei nicht nötig...

Ich bin schon relativ nah dran, allerdings stimmt da etwas noch nicht so ganz. Ich glaube es liegt an der normalen Matrix, sicher sagen kann ich das aber nicht (die Matrix sollte korrekt errechnet werden).

Hier mal der Vertex Shader:

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
#version 150

struct Material{
    vec4 emissive;
    vec4 ambient;
    vec4 diffuse;
    vec4 specular;
    float shininess;
};

struct DirectionalLight{
    vec3 position;
    vec4 ambient;
    vec4 diffuse;
    vec4 specular;
};

uniform mat4 p; // projection
uniform mat4 m; // modelview
uniform mat4 mNormal; // normalen Matrix (aus "m" vorher auf der CPU)
uniform Material material0;
uniform DirectionalLight light0;

in vec3 vertex0;
in vec3 normal0;
in vec2 texCoord0;

out vec2 texCoord;
out vec3 N, L; // Normale, Lichtvektor

void main(){
    vec4 pos = m*vec4(vertex0, 1.0);
    
    N = vec3(normalize(mNormal*vec4(normal0, 1.0)));
    L = -normalize(light0.position);
        
    texCoord = texCoord0;
    gl_Position = p*pos;
}


Fragment:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#version 150

precision highp float;

// [Material und Light struct so wie im Vertex Shader]

uniform sampler2D texture0;
uniform Material material0;
uniform DirectionalLight light0;

in vec2 texCoord;
in vec3 N, L;

void main(){
    vec4 color = material0.ambient*light0.ambient;
    
    float NdotL = max(0.0, dot(N, L));
   
    color += material0.diffuse*light0.diffuse*NdotL;
    
    gl_FragColor = color/*texture(texture0, texCoord.st)*/;
}


Errechnet werden die Matrizen dann so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Projection:
mat4 proj;
proj.setIdentity();
proj.perspective(m_fov, m_ratio, m_zNear, m_zFar);

// Modelview:
mat4 m;
m.setIdentity();
m.lookAt(m_position.x, m_position.y, m_position.z, // Daten aus Kamera Klasse
             m_lookAt.x, m_lookAt.y, m_lookAt.z,
             m_up.x, m_up.y, m_up.z);
m.translate(m_position.x+m_rotationPoint.x, m_position.y+m_rotationPoint.y, m_position.z+m_rotationPoint.z); // Daten aus Model Klasse
m.rotate(m_rotation.x, 1, 0, 0);
m.rotate(m_rotation.y, 0, 1, 0);
m.rotate(m_rotation.z, 0, 0, 1);
m.translate(-m_rotationPoint.x, -m_rotationPoint.y, m_rotationPoint.z);
m.scale(m_scale.x, m_scale.y, m_scale.z);

// Normalen Matrix
mat4 mNormal = m;
mNormal.normalize();


(Wichtigster Code für die Matrizen, sollte allerdings fehlerfrei sein)

Und zu guter letzt ein Bild wie es im Moment aussieht (ambient = 0.1, diffuse = 1.0), der Würfel rotiert, hier in unterschiedlichen Posen, Kamera (5|5|5) Licht (1|0|0):


(Link)


Es sieht so aus als ob nur zwei Flächen beleuchtet werden, wenn ich die Lichtquelle genau über das Model stelle (0|0|1) ist das ganze Teil weiß. Ich hoffe ich bekomme das jetzt doch endlich mal gebacken... ^^

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

04.09.2012, 21:06

Bist du sicher, dass deine Normalen korrekt sind? Zeichne sie doch auch mal mit (empfiehlt sich generell eigentlich immer eine Möglichkeit einzubauen um die schnell anzuzeigen zu können).

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

04.09.2012, 21:32

Die Normalen werden zumindest in Blender korrekt angezeigt, das war früher ja auch schon richtig.

Hier könnt ihr das ganze mal runterladen und selbst sehen. Die Shader liegen in res/shader/, die Kugel (in diesem Fall) dreht sich ab 100 fps (sollte kein Problem sein).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (04.09.2012, 21:38)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

04.09.2012, 22:03

Ich nehm alles zurück, wenn ich die normal Matrix invertiere und transponiere bekomme ich folgendes Bild (mit specular):


(Link)


Was zwar relativ gut aussieht, allerdings dreht sich die Lichtquelle mit der Kamera (die Kugel wird immer von links beleuchtet)...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (04.09.2012, 22:36)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

04.09.2012, 22:33

Exakt und wenn du wissen willst wieso: Rotationmatrix an VertexShader übergeben ;)

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

04.09.2012, 22:40

Alles klar danke dot :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (05.09.2012, 16:38)


Werbeanzeige