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

24.03.2011, 17:50

GLSL mein erster Shader

Hi,

ich hab hier ein kleines (hoff ich doch mal) Problem mit einem einfachen GLSL Vertex Shader der Schatten berechnen soll.
Bei NdotL kommt immer 0 raus, aber warum?

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
#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; // Streuung
uniform vec4 material_specular; // Spiegelung
uniform vec4 material_emissive;
uniform float material_shininess;

struct light{
    vec4 position;
    vec4 diffuse;
    vec4 specular;
    vec4 ambient;
};

uniform light light0; // Lichtquelle

in vec3 a_Vertex;
in vec2 a_TexCoord0;
in vec3 a_Normal; // Normalisierter Vertex

out vec4 color;
out vec2 texCoord0;

void main(void){
    vec3 N = normalize(normal_matrix*a_Normal);
    vec3 L = normalize(modelview_matrix*light0.position).xyz;
    float NdotL = max(dot(N, L), 0.0); // Winkel zwischen Normal und Licht
    
    vec4 finalColor = material_ambient*light0.ambient; // Umgebungslicht wird als fester Wert hinzugefuegt  
    vec4 pos = modelview_matrix*vec4(a_Vertex, 1.0);        
    vec3 E = -pos.xyz; // Sichtvektor negieren
                
    // Flaechennormale zeigt in Richtung Lichtquelle
    if(NdotL > 0.0){    
        finalColor += material_diffuse*light0.diffuse*NdotL; // Streuung hinzufuegen
        vec3 HV = normalize(L+E); // Halber normalisierter -Lichtvektor 
        float NdotHV = max(dot(N, HV), 0.0); // Winkel zwischen Normal und -Lichtvektor
        finalColor += material_specular*light0.specular*pow(NdotHV, material_shininess); // Spiegelung berechnen    
    }
        
    // Ausgabe  
    color = finalColor;
    texCoord0 = a_TexCoord0;
    gl_Position = projection_matrix*pos;    
}


Eingabe:

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
                        m_shaderProgram->bindAttrib(0, "a_Vertex");
            m_shaderProgram->bindAttrib(1, "a_TexCoord0");
            m_shaderProgram->bindAttrib(2, "a_Normal");
            m_shaderProgram->linkProgram();

                        glGetFloatv(GL_MODELVIEW_MATRIX, modelviewMatrix);
            glGetFloatv(GL_PROJECTION_MATRIX, projectionMatrix);
                
            m_shaderProgram->bindShader();
            m_shaderProgram->sendUniform4x4("modelview_matrix", modelviewMatrix);
            m_shaderProgram->sendUniform4x4("projection_matrix", projectionMatrix);
            vector<float> normalMatrix = m_shaderProgram->normalizeMatrix(modelviewMatrix);
            m_shaderProgram->sendUniform3x3("normal_matrix", &normalMatrix[0]);
            
            // Textur
            m_shaderProgram->sendUniform("texture0", 0);
            
            // Materialeigenschaften
            m_shaderProgram->sendUniform("material_ambient", 0.2, 0.2, 0.2, 1);
            m_shaderProgram->sendUniform("material_diffuse", 0.8, 0.8, 0.8, 1);
            m_shaderProgram->sendUniform("material_specular", 1, 1, 1, 1);
            m_shaderProgram->sendUniform("material_emissive", 0, 0.05, 0, 1);
            m_shaderProgram->sendUniform("material_shininess", 0);

            // Lichtquelle
            m_shaderProgram->sendUniform("light0.ambient", 1, 1, 1, 1);
            m_shaderProgram->sendUniform("light0.diffuse", 1, 1, 1, 1);
            m_shaderProgram->sendUniform("light0.specular", 0.3, 0.3, 0.3, 0.3);
            m_shaderProgram->sendUniform("light0.position", 0, 0.5, -0.2, 0);


Die Modelview Matrix sollte richtig sein.

MfG DK

[EDIT]

Ich denke mal das bei "a_Normal" 0 steht. Wenn ich es statisch einsetze wird das Model gefärbt, zwar auch nicht richtig aber ist ja schonmal was :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (24.03.2011, 18:08)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

24.03.2011, 18:47

Nur mal damit ich das richtig verstehe, wie berechnet man mit Vertex-Shadern Schatten?
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

3

24.03.2011, 18:48

Öhm kein Schatten, die Beleuchtung.

4

24.03.2011, 19:02

Muss bei a_Normal (ggf. bei a_TexCoord0, a_Vertex) nicht auch ein "uniform" vorangesetzt werden?
(ich sprech leider nur HLSL)
fka tm

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

24.03.2011, 19:49

Soweit ich das verstanden habe werden die vom VBO übergeben, also a_Vertex (eigentlich gl_Vertex, ist aber als Attribut eingelesen) ist dann jeweils ein Vertex und wird durch das nächste das im Speicher ist ersetzt. Hab aber selber erst damit angefangen^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.03.2011, 21:48

Naja, du hast den Fehler ja doch eh schon gefunden? Offenbar ist a_Normal immer 0. Das liegt dann wohl dran dass du mit deinen VBOs was falsch machst...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

25.03.2011, 13:18

Wenn ich statt a_Normal gl_Normal benutze funktionierts. Allerdings dreht dich Lichtquelle dann mit. Wie verhinder ich das am besten? Und warum sollte mein VBO falsch sein wenn das Model richtig angezeigt wird (ohne Schattierung)?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

25.03.2011, 13:25

Wie bindest du denn dein VBO an a_Normal!?

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

25.03.2011, 15:15

Ich glaube ich hab die Attribute noch nicht wirklich verstanden... Find aber auch nichts auf deutsch dazu (manchmal ja doch besser wenn mans nicht versteht). Ist das nicht aber auch egal? Mit gl_Normal geht es ja auch nicht. Mein Shader sieht jetzt so aus:

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

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

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

struct light{
    vec4 position;
    vec4 diffuse;
    vec4 specular;
};

uniform light light0; // Lichtquelle

in vec2 a_TexCoord0;

out vec4 color;
out vec2 texCoord0;

void main(void){
    vec4 fColor;
    
    vec3 N = normalize(gl_NormalMatrix*gl_Vertex.xyz);
    vec3 L = normalize(modelview_matrix*light0.position).xyz;
    float NdotL = max(dot(N, L), 0.0); // Winkel zwischen Normale und Licht
    
    if(NdotL > 0.0){
        fColor = material_diffuse*light0.diffuse*NdotL;
    }
        
    // Ausgabe  
    texCoord0 = a_TexCoord0;
    color = fColor;
    gl_Position = projection_matrix*modelview_matrix*gl_Vertex; 
}


Die Schattierung wird auch richtig angezeigt, allerdings dreht sie mit wenn ich die Matrix transformiere (ist ja klar), aber das tut sie auch wenn ich sie vor dem transformieren speichere...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

25.03.2011, 16:04

Ok hab das Problem gefunden (bin ich blind?). "L" darf natürlich nicht mit der Modelview Matrix multipliziert werden (ich wollte ja das die Lichtquelle bleibt wo sie ist und sich nur das Model dreht).

Hier das Ergebnis (stellt euch vor es würde sich drehen):


(Link)

Werbeanzeige