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