Unity 3D текстуры - Загрузка 2D текстуры массива
У меня проблема с созданием 3D-текстуры и заполнением ее изображениями. То, что я хочу сделать, - это создать объемную / трехмерную текстуру со значениями RGBA для моих изображений и упорядочить ее в текстуре. Для этого я создаю куб и применяю этот шейдер и скрипт:
скрипт
using UnityEditor;
using UnityEngine;
public class Create3DTex : MonoBehaviour
{
private Texture3D tex;
private Texture2D[] slices;
private Texture2D tex2d;
void Start()
{
int n = 91;
slices = new Texture2D[n];
for (int j = 0; j < n; j++)
{
tex2d = (Texture2D)UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/Resources/Textures/texture" + j + ".png", typeof(Texture2D));
SetTextureImporterFormat(tex2d, true);
slices[j] = tex2d;
}
int size = 64;
tex = new Texture3D(size, size, size, TextureFormat.ARGB32, false);
var cols = new Color[size * size * size];
float mul = 1.0f / (size - 1);
int idx = 0;
var c = new Color[size * size * size];
var countOffset = (slices.Length - 1) / (float)size;
var sliceCount = 0;
var sliceCountFloat = 0f;
for (int z = 0; z < size; ++z)
{
sliceCountFloat += countOffset;
sliceCount = Mathf.FloorToInt(sliceCountFloat);
for (int y = 0; y < size; ++y)
{
for (int x = 0; x < size; ++x, ++idx)
{
cols[idx] = slices[sliceCount].GetPixelBilinear(x / (float)size, y / (float)size);
}
}
}
tex.SetPixels(cols);
tex.Apply();
GetComponent<Renderer>().material.SetTexture("_Volume", tex);
}
public static void SetTextureImporterFormat(Texture2D texture, bool isReadable)
{
if (null == texture) return;
string assetPath = AssetDatabase.GetAssetPath(texture);
var tImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
if (tImporter != null)
{
tImporter.textureType = TextureImporterType.Advanced;
tImporter.isReadable = isReadable;
AssetDatabase.ImportAsset(assetPath);
AssetDatabase.Refresh();
}
}
}
Shader
Shader "DX11/Sample 3D Texture" {
Properties {
_Volume ("Texture", 3D) = "" {}
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma exclude_renderers flash gles
#include "UnityCG.cginc"
struct vs_input {
float4 vertex : POSITION;
};
struct ps_input {
float4 pos : SV_POSITION;
float3 uv : TEXCOORD0;
};
ps_input vert (vs_input v)
{
ps_input o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = v.vertex.xyz;
return o;
}
sampler3D _Volume;
float4 frag (ps_input i) : COLOR
{
return tex3D (_Volume, i.uv);
}
ENDCG
}
}
Fallback "VertexLit"
}
Кажется, что он загружает что-то, но я не знаю, как сделать куб прозрачным, а текстуры выглядят неправильно. Это показывает что-то вроде этого. Есть идеи? Заранее спасибо. Результат
1 ответ
Чтобы правильно визуализировать трехмерные данные, вы должны создать трехмерную структуру с вашими данными в шейдере, а затем интегрировать полученные "объемные пиксели" вдоль линии просмотра. Для этого вам нужно выполнить raycast. http://www.alanzucconi.com/2016/07/01/raymarching/