2

結果がずれていることに気付いたとき、 gl_Position以外で手動のパースペクティブ除算を行う必要があったため、いくつかの実験を行いました。

デフォルトの変換を使用すると、結果の深度値 ( gl_Position.z ) が正しいことに気付きました。

void main()
{
    gl_Position = MVP *vertexPosition;
}

ただし、パースペクティブ分割を手動で実行しようとすると、同等であるはずの深度値が同じではありません(?):

void main()
{
    gl_Position = MVP *vertexPosition;
    gl_Position.xyz /= gl_Position.w;
    gl_Position.w = 1.0;
}

では、Vulkan ではパースペクティブ分割の動作が異なるのでしょうか? もしそうなら、どのように?

ビューポートの深度範囲は、これに影響を与える場合に備えて [0,1] に設定されます。

4

1 に答える 1

0

Vulkan には、付録 D で指定されている多くの不変規則があります。これらの規則のいずれも、第 23 章で概説されている固定関数の頂点後処理手順が、同じことを行おうとする頂点シェーダーに対して不変であるとは述べていません。したがって、これら 2 つの操作で不変の結果が得られるとは期待できません。

于 2016-05-06T15:10:11.433 に答える