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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

19.06.2011, 16:01

Ich weiß nicht, was man groß lernt, wenn man eine Bibliothek schreibt, die Kreuzprodukte ausrechnet, Vektoren addiert oder normiert. Das sollte man besser vorher auch schon können. Und falls man es nicht kann, dann sollte man so eine Bibliothek besser auch gar nicht selber schreiben. Man lernt also nichts.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

12

19.06.2011, 18:29

Naja, da bin ich anderer Meinung.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

19.06.2011, 18:51

Bei anderen Dingen könnte ich Dir ja auch durchaus zustimmen, bei einer Vektor-Bibliothek allerdings nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

14

21.06.2011, 18:46

Sagt mir mal ist das so richtig?


(Link)


Die weißen sind die Normalen, ich finde das das komisch aussieht...

Mastermind

unregistriert

15

21.06.2011, 19:25

Wenn du die Normale pro Vertex approximieren wolltest was dein Code oben glaube ich versucht, dann solltest du 8 normalen haben und nicht 6, oder?

Wenn das die FlächennormalenVertexnormalen sein sollen müssten die Normalen der diagonal gegenüberliegenden Flächen Vertices jeweils paarweise parallel sein was offensichtlich bei dir nicht der Fall ist.

EDIT: Ich seh jetzt erst den Punkt der wohl eine nach vorne zeigende Gerade ist.

Ich würd es auf jeden Fall so rendern, dass die normalen auch in dem Vertex beginnen, dessen Normale sie sein sollen. Macht es übersichtlicher.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

16

21.06.2011, 20:41

ok ich bau dir das mal gerade

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

17

21.06.2011, 20:59

Ich glaub das passt, ich hab die Normalen einfach noch einmal umgedreht (*-1):


(Link)


Aber die Lichtquelle dreht sich mit, obwohl ich die Position nicht mit der Modelview multipliziere?
Guck dir bitte kurz die Shader an:

Vertex:

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
51
52
53
54
55
56
57
#version 130

uniform mat4 projection_matrix;
uniform mat4 modelview_matrix;
uniform mat3 normal_matrix; // Normalisierte Modelview Matrix

// Materialeigenschaften
uniform vec4 material_ambient; // Umgebungslicht
uniform vec4 material_diffuse; // Beleuchtung
uniform vec4 material_specular; // Highlight
uniform float material_shininess;

struct light{
    vec4 position;
    vec4 ambient;
    vec4 diffuse;
    vec4 specular;
    
    float constant_attenuation;
    float linear_attenuation;
    float quadratic_attenuation;
};

uniform light light0; // Lichtquelle

in vec3 a_Vertex;
in vec2 a_TexCoord0;
in vec3 a_Normal;

out vec2 texCoord0;
out vec3 normal;
out vec3 lightDir;
out vec3 halfVector;

out vec4 vertDiffuse;
out vec4 vertAmbient;
out float dist;

void main(void){        
    normal = normalize(normal_matrix*a_Normal);
    vec4 pos = modelview_matrix*vec4(a_Vertex, 1.0);

    vec3 lightPos = light0.position.xyz;
    lightDir = lightPos-pos.xyz;
    vec3 E = -(pos.xyz);
        
    dist = length(lightDir);
    lightDir = normalize(lightDir);
    
    halfVector = normalize(lightPos+E);
    
    vertDiffuse = material_diffuse*light0.diffuse;
    vertAmbient = material_ambient*light0.ambient;
    texCoord0 = a_TexCoord0;
    
    gl_Position = projection_matrix*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
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
#version 130

precision highp float;

uniform sampler2D texture0;

uniform vec4 material_ambient;
uniform vec4 material_diffuse;
uniform vec4 material_specular;
uniform vec4 material_emissive;
uniform float material_shininess;

struct light{
    vec4 position;
    vec4 ambient;
    vec4 diffuse;
    vec4 specular;
    
    float constant_attenuation;
    float linear_attenuation;
    float quadratic_attenuation;
};

uniform light light0;

in vec2 texCoord0;
in vec3 normal;
in vec3 lightDir;
in vec3 halfVector;

in vec4 vertDiffuse;
in vec4 vertAmbient;
in float dist;

out vec4 outColor;

void main(void){
    vec3 N = normalize(normal);
    
    float NdotL = max(dot(N, normalize(lightDir)), 0.0);
    
    vec4 color = vec4(0.0);
    
    if(NdotL > 0.0){                
        color += vertDiffuse*NdotL;
        vec3 HV = normalize(halfVector);
        float NdotHV = max(dot(N, HV), 0.0);
        color += material_specular*light0.specular*pow(NdotHV, material_shininess); 
    }
        
    float attenuation = 1.0/(light0.constant_attenuation+ 
                             light0.linear_attenuation*dist+ 
                             light0.quadratic_attenuation*dist*dist);       
                        
    outColor = ((color*attenuation)+vertAmbient)*texture(texture0, texCoord0.st);
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

22.06.2011, 08:04

Nein, die Normalen passen nicht zu den Würfelvertices. Mir scheint du gewichtest falsch und dein Algorithmus berücksichtigt das L-Shape Problem nicht:


(Link)
@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

19

22.06.2011, 13:31

Sagt mir jetzt nicht viel, aber:

Soll ich also auf jede Normale die Normale des jeweiligen Vertices addieren, nachdem ich alle Normalen eines Vertices miteinander addiert habe?

[EDIT]

Ok, habs versucht, klappt aber nicht. Also wie geht das mit dem L-Shape Problem? Versteh das hier nicht so ganz:

Zitat


Eine sehr einfache aber effektive Methode um schön glatte Normalen zu bekommen ist, wie schon gezeigt wurde, die Normale jedes Dreiecks aus dem Kreuzprodukt von zwei Kantenvektoren zu berechnen, sie aber noch nicht zu normalisieren. Dann werden diese unnormalisierten Dreiecksnormalen zur Vertexnormale aller Vertices die das Dreieck aufspannen addiert (Vertexnormalen werden zuvor natürlich mit 0 initialisiert). Erst wenn alle Dreiecksnormalen auf die Normalen ihrer Vertices addiert wurden werden die fertigen Vertexnormalen in einem letzten Schritt normalisiert.
Das ganze hat den Hintergrund dass die Länge des Kreuzproduktes proportional zur Fläche des Dreiecks ist. Werden die Dreiecksnormalen also unnormalisiert aufaddiert führt das dazu dass Dreiecke mit größerer Fläche (längerer Normale) auch größeren Einfluss auf die Richtung der Vertexnormale haben als kleinere Dreiecke.

(dot)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (22.06.2011, 14:05)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

20

22.06.2011, 15:25

Alle Vertices eines Dreiecks addiert, Normale dazugerechnet, normalisiert:


(Link)


Code: http://cnp.marvinblum.de/index.php?id=29

Oder Normale zu jeweiligen Vertice addiert, normalisiert:


(Link)


Code: http://cnp.marvinblum.de/index.php?id=30

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (22.06.2011, 15:42)


Werbeanzeige