5

オブジェクトが回転していないときに機能するように見える拡散照明シェーダーがあります。ただし、回転変換を適用すると、ライトもオブジェクトと一緒に回転するように見えます。オブジェクトとライトは静止しているようなものですが、カメラはオブジェクトの周りを移動するカメラです。

これが私の頂点シェーダーコードです:

#version 110

uniform mat4 projectionMatrix;
uniform mat4 modelviewMatrix;
uniform vec3 lightSource;

attribute vec3 vertex;
attribute vec3 normal;

varying vec2 texcoord;

void main() {
    gl_Position = projectionMatrix * modelviewMatrix * vec4( vertex, 1.0 );

    vec3 N = gl_NormalMatrix * normalize( normal );
    vec4 V = modelviewMatrix * vec4( vertex, 1.0 );
    vec3 L = normalize( lightSource - V.xyz );

    float NdotL = max( 0.0, dot( N, L ) );

    gl_FrontColor = vec4( gl_Color.xyz * NdotL, 1.0 );

    gl_TexCoord[0] = gl_MultiTexCoord0;
}

ローテーションを行うコードは次のとおりです。

scene.LoadIdentity();
scene.Translate( 0.0f, -5.0f, -20.0f );
scene.Rotate( angle, 0.0f, 1.0f, 0.0f );
object->Draw();

object->Draw() 関数内で、glUniform3f を介して眼球空間の光の位置を送信しました。ライトの位置は静的で、次のように定義されます。

glm::vec4 lightPos( light.x, light.y, light.z, 1.0 );
glm::vec4 lightEyePos = modelviewMatrix * lightPos;
glUniform3f( uniforms.lightSource, lightEyePos.x, lightEyePos.y, lightEyePos.z );

このアプローチの何が問題なのですか?

編集: glm::lookAt コード

Scene scene;
scene.LoadMatrix( projection );
scene.SetMatrixMode( Scene::Modelview );
scene.LoadIdentity();
scene.SetViewMatrix( glm::lookAt( glm::vec3( 0.0f, 0.0f, 0.0f ), glm::vec3( 0.0f, -5.0f, -20.0f ), glm::vec3( 0.0f, 1.0f, 0.0f ) ) );

SetViewMatrix コード:

void Scene::SetViewMatrix( const glm::mat4 &matrix ) {
    viewMatrix = matrix;
    TransformMatrix( matrix );
}

次に、使用していた modelviewMatrix を viewMatrix に変更しました。

glm::vec4 lightPos( light.x, light.y, light.z, 1.0 );
glm::vec4 lightEyePos = viewMatrix * lightPos;
glUniform3f( uniforms.lightSource, lightEyePos.x, lightEyePos.y, lightEyePos.z );
4

1 に答える 1

6

ステートメント 1: ライトの位置は静的です。

ステートメント 2:lightEyePos = modelviewMatrix * lightPos;

この 2 つの主張は矛盾しています。ライトの位置が静的であると想定されている場合は、回転したモデル マトリックスを適用しないでください。

lightPos がワールド座標で定義されている場合、 ではviewMatrixなくで乗算する必要がありmodelviewMatrixます。modelviewMatrix には、モデルの回転を含むモデル マトリックスが含まれています (これを固定光源に適用する必要はありません)。

于 2012-06-05T21:27:20.600 に答える