你应该如何(经常)对3D对象进行深度排序?

时间:2015-01-14 14:23:34

标签: c# performance sorting 3d depth-testing

提高GPU性能的常用方法是使用深度排序。您希望首先绘制最接近您的对象(相机/视口),这样后面的每个片段(像素)都会被Z缓冲区提前释放。
如果是透明对象,则需要从后向前渲染它们,以保持正确的透明度。

我目前正在根据与相机/视口的距离在CPU的每一帧上对我的3D对象进行排序。它们中大约有9000个(可能很容易或多或少),所以逻辑上它在CPU上的性能受到很大影响(有时不仅仅是在GPU上渲染未分类的3d对象)。我只有一个具有位置的3d对象列表,没有奇特的空间分区或任何东西。

我使用包含每个对象的矩阵数据的实例缓冲区来渲染我的对象。

我的问题看似简单:

  • 我应该如何排序我的3D对象?在CPU上,还是在GPU上?如果我 应该在GPU上对它们进行排序,怎么样?
  • 我应该多久对3D进行一次排序 对象?我应该每帧排序吗?我应该做出权衡吗? 每隔一帧对它们进行排序,或者可能只对对象进行排序 每秒一次?

大多数CPU时间似乎都是通过对距离数组进行排序来破坏,而不是自己计算距离......

一些示例代码(C#):

MatrixDistance[] distances = new MatrixDistance[_transformList.Count];
        Vector3 camPos = cam.GetCameraData().Eye;
        for (int i = 0; i < _transformList.Count; i++)
        {
            Vector3 v;
            v.X = camPos.X - _transformList[i].M14;
            v.Y = camPos.Y - _transformList[i].M24;
            v.Z = camPos.Z - _transformList[i].M34;
            float squaredD = v.X * v.X + v.Y * v.Y + v.Z * v.Z;
            var newMD = new MatrixDistance(_transformList[i], squaredD);
            distances[i] = newMD;
        }
        Array.Sort(distances);
        _distanceSortedTransformList = new List<Matrix>();
        for (int i = 0; i < distances.Length; i++)
        {
            _distanceSortedTransformList.Add(distances[i].Matrix);
        }

MatrixDistance是以下类:

class MatrixDistance: IComparable<MatrixDistance>
{
    public Matrix Matrix;
    public float Distance;

    public MatrixDistance(Matrix m, float d)
    {
        Matrix = m;
        Distance = d;
    }

    public int CompareTo(MatrixDistance other)
    {
        return this.Distance.CompareTo(other.Distance);
    }
}

0 个答案:

没有答案