4

私はパーソナル グラフィック エンジンに取り組んでおり、スポット ライトの開発を開始しました。問題は、レンダリングが論理的でないことです。簡単にするために、以下のシェーダーの例では、光とテクスチャの管理に関するすべての情報を消去しました。

頂点シェーダー コードは次のとおりです。

#version 400

layout (location = 0) in vec3 VertexPosition;

uniform mat4 ModelViewMatrix;
uniform mat4 MVP;

out vec3 VPosition;

void main(void)
{
    VPosition = vec3(ModelViewMatrix * vec4(VertexPosition, 1.0f));     //Eye coordinates vertex position
    gl_Position = MVP * vec4(VertexPosition, 1.0f);
}

そしてフラグメントシェーダーコード:

#version 400

in vec3 Position;   //IN EYE COORDINATES

layout (location = 0) out vec4 FragColor;

uniform int lightCount;

struct SpotLight
{
    vec4 Position;      //ALREADY IN EYE COORDINATES
    vec3 La, Ld, Ls;
    vec3 direction;
    float exponent;
    float cutoff;
};

uniform SpotLight LightInfos[1];

vec3 getLightIntensity(void)
{
    vec3 LightIntensity = vec3(0.0f);

    for (int idx = 0; idx < lightCount; idx++)
    {
        vec3 lightDirNorm = normalize(vec3(LightInfos[idx].Position) - Position);
        vec3 spotDirNorm = normalize(LightInfos[idx].direction);
        float angle = acos(dot(-lightDirNorm, spotDirNorm));
        float cutoff = radians(clamp(LightInfos[idx].cutoff, 0.0f, 90.0f));

        vec3 ambient = vec3(0.1f, 0.1f, 0.8f);      //Color out of the spotlight's cone.
        vec3 spotColor = vec3(0.1f, 0.8f, 0.1f);    //Color within the spotlight's cone.

        if (angle < cutoff)
        {
            LightIntensity = spotColor;
        }
        else
        {
            LightIntensity = ambient;
        }
    }
    return (LightIntensity);
}

void main(void)
{
    FragColor = vec4(getLightIntensity(), 1.0f);
}

ライト位置プロパティを送信する C++ コードは次のとおりです。

glm::vec4 lightPositionVec = viewMatrix * glm::vec4(lightPosition[0], lightPosition[1], lightPosition[2], lightPosition[3]);

program->setUniform(std::string("LightInfos[").append(Utils::toString<int>(idx)).append("].Position").c_str(), lightPositionVec);

スポット ライトのプロパティは次のとおりです。

<position x="0.0" y="2.0" z="0.0" w="1" />
<direction x="0.0" y="-1.0" z="0.0" />
<exponent>3.0</exponent>
<cutoff>50.0</cutoff>

ビューのプロパティ:

<camera name="cam1">
  <perspective fovy="70.0" ratio="1.0" nearClipPlane="0.1" farClipPlane="1000.0"/>
  <lookat>
     <eye x="0.0" y="50.0" z="50.0" />
     <target x="0.0" y="0.0" z="0.0" />
     <up x="0.0" y="1.0" z="0.0"/>
  </lookat>
</camera>

これらの情報を C++ コードのプログラム シェーダーに送信する前に確認しましたが、正しいものでした。

結果は次のとおりです。

ここに画像の説明を入力

そして、次のカメラ プロパティを使用してカメラを平面の近くに配置すると、次のようになります。

 <camera name="cam1">
      <perspective fovy="70.0" ratio="1.0" nearClipPlane="0.1" farClipPlane="1000.0"/>
      <lookat>
         <eye x="0.0" y="10.0" z="20.0" />
         <target x="0.0" y="0.0" z="0.0" />
         <up x="0.0" y="1.0" z="0.0"/>
      </lookat>
    </camera>

結果は次のとおりです(現実に近いですが、まだ正しくありません):

ここに画像の説明を入力

ご覧のとおり、論理的ではありません。x=0、y=1、z=0、下向きのスポット ライト方向 (x=0、y=-1、z=0) にスポットがあるので、この結果を理解してください。さらに、すべてのベクトルは目の座標にあります。スポットライトの効果はカメラの位置に依存する印象があります。誰でも私を助けることができますか?

4

2 に答える 2

0

問題は

out vec3 VPosition;

in vec3 Position;
于 2013-08-16T12:55:39.437 に答える