提高GPU性能的常用方法是使用深度排序。您希望首先绘制最接近您的对象(相机/视口),这样后面的每个片段(像素)都会被Z缓冲区提前释放。
如果是透明对象,则需要从后向前渲染它们,以保持正确的透明度。
我目前正在根据与相机/视口的距离在CPU的每一帧上对我的3D对象进行排序。它们中大约有9000个(可能很容易或多或少),所以逻辑上它在CPU上的性能受到很大影响(有时不仅仅是在GPU上渲染未分类的3d对象)。我只有一个具有位置的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);
}
}