2016-04-04 9 views
1

У меня возникла проблема создания трехмерной текстуры и заполнения ее изображениями. То, что я хочу сделать, это создать объемную/трехмерную текстуру с значениями RGBA для моих изображений и привести ее в порядок в текстуре. Для того, чтобы сделать это, я создать куб, и применить этот шейдер и скрипт:3D-текстуры Unity - Загрузка 2D-текстуры Array

Script

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" 
    } 

Его, кажется, что он загружает что-то, но я не знаю, как чтобы сделать куб прозрачным, и текстуры не выглядят правильно. Это показывает что-то вроде этого. Есть идеи? Заранее спасибо.

ответ

0

Для правильной визуализации 3d-данных необходимо создать трехмерную структуру с вашими данными в шейдере, а затем интегрировать полученные «точечные пиксели» вдоль линии просмотра. Для этого вам нужно выполнить raycast. http://www.alanzucconi.com/2016/07/01/raymarching/

 Смежные вопросы

  • Нет связанных вопросов^_^