Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: Spiele-/Grafikprogrammierung ::  Artefakte bei mehreren Spotlights     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
teacup3000
Unregistrierter




Beitrag teacup3000 Unregistrierter 21:50:26 17.06.2017   Titel:   Artefakte bei mehreren Spotlights            Zitieren

Hallo,

Ich habe in mein Programm ein Array eingebaut, wo ich mehrere mehrere Lichter gleichzeitig benutzen kann.
Das Problem ist, dass ich durch die neuen Änderungen weiße Artefakte im Bild hab. Je mehr Lichtquellen ich hinzufüge, desto mehr Artefakte entstehen.
Siehe -> http://up.picr.de/29516837id.jpg

ich hab hier noch ein paar Snippets aus meinem Code:
C++:
1
2
3
4
5
6
7
8
9
10
11
//Aufruf in Game Loop
lightShader.setVec3("spotLight[1].position", spotLightPositions[1]);
        lightShader.setVec3("spotLight[1].direction", ufodirection);
        lightShader.setVec3("spotLight[1].ambient", 0.0f, 0.0f, 0.0f);
        lightShader.setVec3("spotLight[1].diffuse", 10.0f, 10.0f, 10.0f);
        lightShader.setVec3("spotLight[1].specular", 1.0f, 1.0f, 1.0f);
        lightShader.setFloat("spotLight[1].constant", 1.0f);
        lightShader.setFloat("spotLight[1].linear", 0.09);
        lightShader.setFloat("spotLight[1].quadratic", 0.032);
        lightShader.setFloat("spotLight[1].cutOff", glm::cos(glm::radians(12.5f)));
        lightShader.setFloat("spotLight[1].outerCutOff", glm::cos(glm::radians(15.0f)));


und mein Fragment Shader:
C++:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#version 330 core
out vec4 FragColor;
 
struct Material {
    sampler2D diffuse;
    sampler2D specular;    
    float shininess;
};
 
struct SpotLight {
    vec3 position;  
    vec3 direction;
    float cutOff;
    float outerCutOff;
 
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
   
    float constant;
    float linear;
    float quadratic;
};

#define NR_SPOT_LIGHTS 3

 
in vec3 FragPos;  
in vec3 Normal;  
in vec2 TexCoords;
 
uniform vec3 viewPos;
uniform Material material;
uniform SpotLight spotLight[NR_SPOT_LIGHTS];
 
vec3 CalcSpotLight(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir);
 
void main()
{
    vec3 viewDir = normalize(viewPos - FragPos);
    vec3 norm = normalize(Normal);
    vec3 result;
 
    for(int i = 0; i<NR_SPOT_LIGHTS; i++)
     result += CalcSpotLight(spotLight[i], norm, FragPos, viewDir);  
 
    FragColor = vec4(result, 1.0);
 
}
 
vec3 CalcSpotLight(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir)
{
 
    // ambient
    vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb;
   
    // diffuse
    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(light.position - FragPos);
    float diff = max(dot(norm, lightDir), 1.0);
    vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb;  
   
    // specular
    vec3 reflectDir = reflect(-lightDir, norm);  
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
    vec3 specular = light.specular * spec * texture(material.specular, TexCoords).rgb;  
   
    // spotlight (soft edges)
    float theta = dot(lightDir, normalize(-light.direction));
    float epsilon = (light.cutOff - light.outerCutOff);
    float intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0, 1.0);
    diffuse  *= intensity;
    specular *= intensity;
   
    // attenuation
    float distance    = length(light.position - FragPos);
    float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));    
    ambient  *= attenuation;
    diffuse   *= attenuation;
    specular *= attenuation;  
       
    return (ambient + diffuse + specular);
   
}


Ich hoffe jemand kann mir weiterhelfen.
Danke.
rapso
Moderator

Benutzerprofil
Anmeldungsdatum: 17.06.2002
Beiträge: 8748
Beitrag rapso Moderator 02:03:40 19.06.2017   Titel:              Zitieren

reduziere den CalcSpotLight code bis du die stelle findest die das verursacht, z.B. kannst du erst nur ambient, diffuse oder specular ausgeben. Danach gibst du die einzelnen Werte von der jeweiligen beleuchtungskomponente aus.

grob geschaetzt kann das ein NAN sein oder division by zero oder desgleichen.

_________________
follow me|
-Mod im Spiele-/Grafikprogrammierung
C++ Forum :: Spiele-/Grafikprogrammierung ::  Artefakte bei mehreren Spotlights   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.