没有什么可以阻止您使用 3D 数字数组来存储像素数据,除了存储它的内存。像这样:
struct Pixel {
int Red;
int Green;
int Blue;
}
public Pixel[,,] myPix3D = new Pixel[300, 300, 300];
那就是“位图的 3D 等价物”
或者,您可以存储每个像素及其位置,以节省内存。这样,您就不会在对象中存储任何空白空间。
struct Pixel {
int Red;
int Green;
int Blue;
double X;
double Y;
double Z;
}
如果您从诸如 MRI 或 CAT 扫描仪之类的设备进行非常详细的 3D 扫描,这些结构将很有用,事实上,此类扫描的“切片”集合基本上是相同的。大多数时候,我们只关心尽可能快地将可见像素放在屏幕上,并且存在更好的结构,例如矢量模型、三角形集合等。
存储 3D 图像的另一种方法,实际上经常使用,是深度图。对于每个像素,您存储一个值,指示它与“屏幕”或投影表面的距离有多近,并且在随后的绘图操作中,您会跳过任何深度大于当前像素的像素,因为它不会可见的。(也称为 Z 缓冲)
另请注意,当我们进行实际渲染 3D 对象的过程时,我们会首先在 3D 空间中创建它们 - 但我们通常不会对这些对象进行纹理映射,因此“内存中”表示暂时是您的对象类型谈论但位图总是包含所有像素,我们并不总是需要它,所以我们不会将实体对象渲染到 3D 空间中,只渲染线框。大多数图形引擎在将临时 3D 空间投影到 2D 之后应用纹理,并且已经应用了许多优化。
您可以使用该中间步骤在 3D 空间中创建您的点,但是当我们感兴趣的只是渲染 2D 图像时,这样做效率不高。如果您对 3D 位图有一些用途,它可以很容易地从已投影到 3D 空间的线框模型创建。