Texture3D必须要在脚本中创建
using UnityEngine;
public class Create3DTex : MonoBehaviour {
public MeshRenderer _renderer;
Texture3D texture3D;
void Start()
{
texture3D = CreateTexture3D(256);
_renderer.material.SetTexture("_Volume", texture3D);
}
Texture3D CreateTexture3D(int size)
{
Color[] colorArray = new Color[size * size * size];
texture3D = new Texture3D(size, size, size, TextureFormat.RGBA32, true);
float r = 1.0f / (size - 1.0f);
for (int x = 0; x < size; x++)
{
for (int y = 0; y < size; y++)
{
for (int z = 0; z < size; z++)
{
Color c = new Color(x * r, y * r, z * r, 1.0f);
colorArray[x + (y * size) + (z * size * size)] = c;
}
}
}
texture3D.SetPixels(colorArray);
texture3D.Apply();
return texture3D;
}
}
shader
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
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 = UnityObjectToClipPos(v.vertex);
o.uv = v.vertex.xyz * 0.5 + 0.5;
return o;
}
sampler3D _Volume;
float4 frag(ps_input i): COLOR
{
return tex3D(_Volume, i.uv);
}
ENDCG
}
}
Fallback "VertexLit"
}