没有什么能够阻止您使用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空间中创建它们 - 但我们通常不会纹理映射这些对象,因此“in内存“表示暂时是您正在讨论的对象的类型,但位图总是包含所有像素,并且我们并不总是需要这样做,所以我们不会将实体对象渲染到3D空间中,而只是渲染线框。大多数图形引擎在临时3D空间投影到2D之后应用纹理,并且已应用了许多优化。
您可以使用该中间步骤在3D空间中创建点,但当我们感兴趣的是渲染2D图像时,这样做效率不高。如果您对3D位图有一些使用,可以很容易地从投影到3D空间的线框模型创建。
正如你所说,一个位图的像素是白色黑色or.color,没有透明度..所以每一个3D位图是一个立方体 – Sayse 2013-05-03 22:15:37
@Sayse好点,可以使像素ARGB的根本RGB,例如代替'System.Drawing.Color'类,或者像素显示为半透明。 – 2013-05-03 22:55:44