1

私はテッセレーション シェーダーを使用して glsl で作業しており、ディスプレイスメント マッピングを実行しようとしています。動作していますが、マトリックス変換コードをテッセレーション評価シェーダーから頂点シェーダーに移動したいと考えています。これを頂点シェーダーに入れたい理由は、すべてのサブ三角形の頂点に対してこの計算を実行したくないためです。頂点を頂点シェーダーのスクリーンスペースに配置して、すべての三角形がどれだけあるべきかを決定できるようにしたいからです。テッセレーション コントロール シェーダーで分割されます。

動作しないバージョンは「ほぼ」動作しており、三角形がレンダリングされるときにいくつかの問題があります。

何が間違っているのか、ほんの少しでもヒントをいただければ幸いです。


この(悪い)バージョンは機能します(位置と法線はテッセレーション評価シェーダーで変換されます)

// vertex shader
void main_(void)
{
    gl_Position     = VertexPosition;
    VertexTexCoord1 = VertexTexCoord;
    VertexNormal1   = VertexNormal;
}

// tessellation evaluation shader
void main_()
{
    VertexTexCoord3     =    interpolate(VertexTexCoord2);
    vec3 normal         =    interpolate(VertexNormal2);
    vec4 pos            =    interpolate(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_in[2].gl_Position);

    vec4 movement       =    vec4(normal * (texture2D(heigthMap,VertexTexCoord3).r), 0.0);

    gl_Position         =    mvpMatrix * (pos + movement);
}

このバージョンは動作しません (位置と法線は頂点シェーダーで変換されます)

// vertex shader
void main(void)
{
    gl_Position     = mvpMatrix * VertexPosition;
    VertexTexCoord1 = VertexTexCoord;
    VertexNormal1   = mat3(mvpMatrix) * VertexNormal;
}

// tessellation evaluation shader
void main()
{
    VertexTexCoord3     =    interpolate(VertexTexCoord2);
    vec3 normal         =    interpolate(VertexNormal2);
    vec4 pos            =    interpolate(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_in[2].gl_Position);

    vec4 movement       =    vec4(normal * (texture2D(heigthMap,VertexTexCoord3).r), 0.0);

    gl_Position         =    (pos + movement);
}
4

1 に答える 1

3

「動作しない」バージョンでは、テッセレーション シェーダーの最後の行が正しくないようです。ソースバリアントでは、「動き」に mvpMatrix を掛けたものがあることを忘れています。

私はこれを使用しようとしたでしょう:

// tessellation evaluation shader
void main()
{
    VertexTexCoord3     =    interpolate(VertexTexCoord2);
    vec3 normal         =    interpolate(VertexNormal2);
    vec4 pos            =    interpolate(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_in[2].gl_Position);

    vec4 movement       =    vec4(normal * (texture2D(heigthMap,VertexTexCoord3).r), 0.0);

    /// This multiplication by mvpMatrix is inevitable
    gl_Position         =    (pos + mvpMatrix * movement);
}

ステージの順序が異なっていたら申し訳ありませんが、上記のコード (2 つのバージョン) は間違いなく同等ではありません。

于 2012-07-02T21:28:31.023 に答える