0

タイトルはそれをすべて言います..照明システムに組み込まれたopenglsを使用すると、鏡面反射光はオブジェクトからの距離に応じて増減しませんが、シェーダーの実装によって異なります。

頂点シェーダー:

#version 330

layout (location = 0) in vec3 position;
layout (location = 1) in vec2 texCoord;
layout (location = 2) in vec3 normal;

out vec2 texCoord0;
out vec3 normal0;
out vec3 worldPos0;

uniform mat4 transform;
uniform mat4 normalRotation;
uniform mat4 transformProjected;

void main()
{
    gl_Position = transformProjected * vec4(position, 1.0);
    texCoord0 = texCoord;

    normal0 = normalize((normalRotation * vec4(normal, 0.0))).xyz;
    worldPos0 = (transform * vec4(position, 1.0)).xyz; 
}

フラグメント シェーダー:

#version 330

in vec2 texCoord0;
in vec3 normal0;
in vec3 worldPos0;

out vec4 fragColor;

struct BaseLight
{
    vec3 colorDiffuse;
    vec3 colorSpecular;
    float intensityDiffuse;
};
struct DirectionalLight
{
    BaseLight base;
    vec3 direction;
};

uniform vec3 tint;
uniform sampler2D sampler;

uniform vec3 eyePos; // camera pos

uniform vec3 ambientLight;
uniform vec3 emissiveLight;

//material 
uniform float specularIntensity;
uniform float specularPower;

uniform DirectionalLight directionalLight;

vec4 calcLight(BaseLight base,vec3 direction, vec3 normal)
{
    float diffuseFactor = dot(normal, -direction);

    vec4 diffuseColorFinal = vec4(0,0,0,0);
    vec4 specularColorFinal = vec4(0,0,0,0);

    if(diffuseFactor > 0)
    {
      diffuseColorFinal =  vec4(base.colorDiffuse,1) * diffuseFactor * base.intensityDiffuse;

      vec3 directionToEye = normalize(eyePos - worldPos0);
      vec3 reflectDirection = normalize(reflect(direction, normal));

      float specularFactor = dot(directionToEye, reflectDirection);
      specularFactor = pow(specularFactor, specularPower);

      if(specularFactor > 0)
          specularColorFinal = vec4(base.colorSpecular,1) * specularFactor   * specularIntensity;
    }
    //
   return diffuseColorFinal + specularColorFinal;
}



void main()
{
    vec4 colorD = texture(sampler, texCoord0.xy) * vec4(tint,1);
    vec3 normal = normal0;
    vec4 totalLight = vec4(ambientLight,1) + vec4(emissiveLight,1); 

     totalLight += calcLight(directionalLight.base,-directionalLight.direction,normal);


    fragColor = colorD * totalLight;
}

ここに画像の説明を入力 ここに画像の説明を入力

2 つの画像からわかるように、鏡面反射光は、カメラが平面から遠くなるにつれて、より大きな表面積を占めます。照明に組み込まれた opengls を使用した私のテストでは、これは起こりません。これを修正する方法はありますか?照明は初めてですが、これは指向性光源の場合は正常でしょうか? 助けてくれてありがとう!

また、eyePos ユニフォームを cameraPos に設定しています。それが役立つかどうかはわかりません。

4

1 に答える 1