1

私は現在、独自の GLSL シェーダーを作成しており、スムーズなシェーディングが必要でした。シェーディングは、VBO に送信する前に法線を計算したときに機能しましたが、ここでの問題は、ボーン マトリックスを使用してアニメーションを実装すると、法線が正しくないことです。

ジオメトリ シェーダを使用して法線を計算していますが、法線を滑らかにする方法がわかりません。

ここに私のジオメトリシェーダーがあります:

#version 150

layout(triangles) in;
layout (triangle_strip, max_vertices=3) out;

in vec2 texCoord0[3];
in vec3 worldPos0[3];

out vec2 texCoord1;
out vec3 normal1;
out vec3 worldPos1;

 void main()
 {

        vec3 n = cross(worldPos0[1].xyz-worldPos0[0].xyz, worldPos0[2].xyz-worldPos0[0].xyz);
        for(int i = 0; i < gl_in.length(); i++)
        {
             gl_Position = gl_in[i].gl_Position;

             texCoord1 = texCoord0;
             normal1 = n;
             worldPos1 = worldPos0;

             EmitVertex();
        }
}

法線を計算する面の隣に面が必要ですが、それらを取得する方法がわかりません。

4

1 に答える 1

2

OpenGL のジオメトリ シェーダーは、メッシュ全体ではなく単一の三角形にしかアクセスできないため、法線は単一の三角形から計算する必要があります。

この問題の通常の解決策は、頂点ごとに 1 回法線を計算し、簡単にアクセスできるように頂点配列に保存することです。シェーダーで何も再計算する必要がないため、これはより高速で単純であることがわかります。

于 2013-10-13T14:19:50.227 に答える