Затухание не применяется правильно

Я не могу понять, правильно ли применяется ослабление света или нет.

Кажется, что это не потому, что блеск стальной рамы для куба, расположенного на (-500, 100, 100)(слева) слишком много выделено - я думаю, должно быть меньше, учитывая, что положение света (белый куб) (100.0, 100.0f, 100.0f),

Я использую эту формулу, чтобы получить затухание

1.0 / (constant + linear * distance + quadratic * (distance^2))

Фрагмент шейдера:

#version 450 core

struct Material {
    sampler2D diffuse;
    sampler2D specular;
    float shininess;
};

struct Light {
    vec3 position;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;    
    float constant;
    float linear;
    float quadratic;
};

uniform vec3 cameraPosition;
uniform Material material;
uniform Light light;    
in vec3 vNormal;
in vec2 vTexCoord;
in vec4 fragPosition;
out vec4 color;

void main() {
    vec3 norm = vNormal;
    vec3 lightDir = normalize(light.position - vec3(fragPosition.xyz));
    vec3 viewDir = normalize(cameraPosition - vec3(fragPosition.xyz));
    vec3 reflectDir = reflect(-lightDir, norm);

    vec3 ambient  = light.ambient * vec3(texture(material.diffuse, vTexCoord));
    vec3 diffuse  = light.diffuse * max(dot(norm, lightDir), 0.0) * vec3(texture(material.diffuse, vTexCoord));
    vec3 specular = light.specular * pow(max(dot(viewDir, reflectDir), 0.0f), material.shininess) * vec3(texture(material.specular, vTexCoord));

    float d = length(lightDir);
    float attenuation = 1.0f / (light.constant + light.linear * d + light.quadratic * (d * d));


    ambient *= attenuation;
    diffuse *= attenuation;
    specular *= attenuation;

    color = vec4(ambient + diffuse + specular, 1.0f);
}

И передать следующие значения в программу

glUniform1f(lightConstantLoc,  1.0);
glUniform1f(lightLinearLoc,    0.1);
glUniform1f(lightQuadraticLoc, 0.01);

Также те же позиции, но изменили угол обзора

Так что там не так? Мои расчеты неверны? Что там происходит?

0 ответов

Другие вопросы по тегам