Texture2D到Texture3D

时间:2014-05-10 14:24:32

标签: opengl unity3d directx textures shader

我想知道如何从Texture2D创建Texture3D。

enter image description here

我找到了一些很好的例子:Unity 4 - 3D Textures (Volumes)Unity - 3D TexturesColor Correction Lookup Texture

int     dim = tex2D.height;
Color[] c2D = tex2D.GetPixels();
Color[] c3D = new Color[c2D.Length];
for (int x = 0; x < dim; ++x)
{
    for (int y = 0; y < dim; ++y)
    {
        for (int z = 0; z < dim; ++z)
        {
            int y_ = dim - y - 1;
            c3D[x + (y * dim) + (z * dim * dim)] = c2D[z * dim + x + y_ * dim * dim];
        }
    }
}

但这仅在你有

时才有效
Texture2D.height= Mathf.FloorToInt(Mathf.Sqrt(Texture2D.width))

或如果

Depth = Width = Height

当深度不等于宽度或高度时,如何提取值? 这似乎很简单,但我遗漏了一些东西......

非常感谢你。

3 个答案:

答案 0 :(得分:2)

您可以按如下方式分割纹理:

//Iterate the result
for(int z = 0; z < depth; ++z)
    for(int y = 0; y < height; ++y)
        for(int x = 0; x < width; ++x)
            c3D[x + y * width + z * width * height]
              = c2D[x + y * width * depth + z * width]

您可以按如下方式获取此索引公式:

在x方向上前进1会导致增加1(仅下一个像素)。

在y方向上前进1会导致增加depth * width(跳过4张相应宽度的图像)。

在z方向上前进1会导致增加width(跳过一个图像行)。

或者如果你更喜欢另一个方向:

//Iterate the original image
for(int y = 0; y < height; ++y)
    for(int x = 0; x < width * depth; ++x)
         c3D[(x % width) + y * width + (x / width) * width * height] = c2D[x + y * width * depth];

答案 1 :(得分:1)

不幸的是,关于3DTexture的文档并不多。我试图简单地使用c2D作为纹理数据,但它没有给出合适的结果。

目前我尝试过这样可以提供更好的结果,但我不知道它是否正确。

for (int x = 0; x < width; ++x)
{
    for (int y = 0; y < height; ++y)
    {
        for (int z = 0; z < depth; ++z)
        {
            int y_ = height - y - 1;
            c3D[x + (y * height) + (z * height * depth)] = c2D[z * height + x + y_ * height * depth];
        }
    }
}

答案 2 :(得分:0)

从你的照片看,你看起来像是你想要并排的3D纹理的平面?那么你想要一个尺寸(宽度,高度,深度)的3D纹理来自2D纹理(宽度*深度,高度)?你应该可以这样做:

for (int z = 0; z < depth; ++z)
{
    for (int y = 0; y < height; ++y)
    {
        memcpy(c3D + (z * height + y) * width, c2D + (y * depth + z) * width, width * sizeof(Color));
    }
}