0

プロジェクトにインポートした .3ds メッシュが非常に大きいので、glscalef を使用してサイズを縮小したいと考えていました。ただし、シェーダーで使用するレンダリング アルゴリズムは法線ベクトル値を使用するため、レンダリング アルゴリズムをスケーリングすると、本来の動作をしなくなります。では、これをどのように改善しますか?法線用の glscalef もありますか?

4

3 に答える 3

1

法線ベクトルは、モデル ビュー マトリックスの転置された逆行列によって変換されます。ただし、2 つ目の制約として、法線の長さは単位であり、モデルビューをスケーリングするとそれが変更されます。したがって、シェーダーでは、正規化ステップを適用する必要があります

#version 330

uniform mat4x4 MV;
uniform mat4x4 P;
uniform mat4x4 N; // = transpose(inv(MV));

in vec3 vertex_pos;    // vertes position attribute
in vec3 vertex_normal; // vertex normal attribute

out vec3 trf_normal;

void main()
{
    trf_normal = normalize( (N * vec4(vertex_normal, 1)).xyz );
    gl_Position = P * MV * vertex_pos;
}

「正規化」とは、ベクトルを単位長の共線ベクトルに変換するプロセスであり、面法線の概念とは関係ないことに注意してください。

于 2013-03-06T12:21:32.377 に答える
0

法線を変換するには、変換行列の逆転置を乗算する必要があります。これが事実である理由についてはいくつかの説明がありますが、最良の説明はおそらくここにあります

于 2013-03-06T12:20:36.303 に答える
0

Normal は MV^IT によって変換され、modelview 行列の逆転置です。redbook を読んでください。すべてが説明されています。

于 2013-03-06T12:31:51.663 に答える