5

テッセレーション コントロールと評価シェーダーを正常に機能させることに成功しましたが、頂点ごとではなく (三角形) 面の法線を計算しているため、シーンのライティングはまだブロック状です。テッセレーションを使用するようになったので、tess eval またはジオメトリ シェーダーのいずれかで、新しくテッセレーションされた頂点の新しい法線頂点を計算する必要があるようです。

頂点ごとの法線を滑らかにするために、問題の頂点を共有するすべての三角形の面ごとの法線を計算し、これらの面法線の加重平均を計算する必要があります。しかし、tess eval またはジオメトリ シェーダーですべての三角形の面を取得する方法がわかりません。ジオメトリ シェーダーのlayout (triangles_adjacency) inオプションは有望に見えますが、その使用方法に関する情報はあまりありません。

この方法で法線/バンプ マップを使用せずに、GPU で頂点法線ごとにスムーズに計算することは可能ですか? 最終的な目標は、テッセレーションの詳細レベルの向上から恩恵を受ける、スムーズな頂点ライティングを実現することです。

これが私のテッセレーション コントロールと評価シェーダーです。

// control
#version 400

layout (vertices = 3) out;

in vec3 vPosition[];
out vec3 tcPosition[];

const float tessLevelInner = 1.0;
const float tessLevelOuter = 1.0;

void main()
{
    tcPosition[gl_InvocationID] = vPosition[gl_InvocationID];
    if (gl_InvocationID == 0) {
        gl_TessLevelInner[0] = tessLevelInner;
        gl_TessLevelOuter[0] = tessLevelOuter;
        gl_TessLevelOuter[1] = tessLevelOuter;
        gl_TessLevelOuter[2] = tessLevelOuter;
    }
}

// eval
#version 400

layout (triangles, equal_spacing, cw) in;
uniform mat4 uProj;
uniform mat4 uModelView;

in vec3 tcPosition[];
out vec3 tePosition;

void main()
{
    vec3 p0 = gl_TessCoord.x * tcPosition[0];
    vec3 p1 = gl_TessCoord.y * tcPosition[1];
    vec3 p2 = gl_TessCoord.z * tcPosition[2];

    tePosition = p0 + p1 + p2;
    gl_Position = uProj * uModelView * vec4(tePosition, 1);
}
4

0 に答える 0