Artefakte bei mehreren Spotlights



  • 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:

    //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:

    #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.


  • Mod

    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.


Log in to reply