一些新东西学习 - Texture3D,Texture2DArray
2017-07-30 11:24
369 查看
Texture3D
Texture3D需要先在脚本中创建3D材质,然后赋予shader。需要DX11支持,和材质采样一样,3D维度上可以被repleat和插值
参考文章:http://blog.csdn.net/wolf96/article/details/46239557
脚本:
using UnityEngine; public class Texture3DTest : MonoBehaviour { public Renderer target; public int size = 16; void Start() { var tex = new Texture3D(size, size, size, TextureFormat.RGBA32, false); var colors = new Color[size * size * size]; var k = 0; for (int z = 0; z < size; z++) { for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++, k++) { if (z == 0) colors[k] = Color.blue; else colors[k] = Color.red; } } } tex.wrapMode = TextureWrapMode.Repeat; tex.SetPixels(colors); tex.Apply(); target.material.SetTexture("_MainTexture", tex); } }
shader:
Shader "Test/Texture3D" { Properties { _MainTexture("Texture", 3D) = "" {} _Z("Z",float)=0 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; v2f vert(appdata_tan v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.texcoord; return o; } sampler3D _MainTexture; float _Z; float4 frag(v2f i) : COLOR { return tex3D(_MainTexture, fixed3(i.uv.x, i.uv.y, _Z)); } ENDCG } } }
shader中类型声明为'3D'
这里只绘制了蓝色和红色两种颜色,最后会被插值:
Texture2DArray
最早在Adam的demo里,地形中用到了这个东西。需要DX10支持顾名思义,这个可以存放Texture2D的数组
参考:
https://docs.unity3d.com/Manual/SL-TextureArrays.html
https://github.com/keijiro/Texture2DArrayTest
脚本:
using UnityEngine; public class Texture2DArrayTest : MonoBehaviour { public Material material; Texture2DArray mTexture; void Start() { mTexture = new Texture2DArray(256, 256, 2, TextureFormat.RGBA32, false, true); var temp = new Texture2D(256, 256, TextureFormat.RGBA32, false); for (int x = 0; x < temp.width; x++) for (int y = 0; y < temp.height; y++) temp.SetPixel(x, y, Color.red); mTexture.SetPixels(temp.GetPixels(), 0); for (int x = 0; x < temp.width; x++) for (int y = 0; y < temp.height; y++) temp.SetPixel(x, y, Color.blue); mTexture.SetPixels(temp.GetPixels(), 1); mTexture.Apply(); material.SetTexture("_TextureArray", mTexture); } }
Shader:
Shader "Unlit/NewUnlitShader" { Properties { _TextureArray("TexArray", 2DArray) = "" {} _Index("Index",float)=0 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #pragma target 3.5 #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _Index; UNITY_DECLARE_TEX2DARRAY(_TextureArray); v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 r = UNITY_SAMPLE_TEX2DARRAY(_TextureArray, float3(i.uv.x, i.uv.y, _Index)); return r; } ENDCG } } }
shader中类型声明为2DArray
这里也是放了红蓝两种颜色的图片,分别放在两个索引当中
最终效果:
相关文章推荐
- hustoj相关学习资料以及一些问题的整理还有乱七八糟的东西
- 看腾讯页面学习的一些东西
- 关于Cocos2d-X 学习中遇到的一些难以理解的东西 将来将会一一删除
- 穆穆读的一些书籍推荐,读书的理由?读书的好处?为什么要读书?读什么书?让我们一起来读书,总之我们需要学习新的东西来适应这个社会的飞速变化。
- android网络编程学习的一些东西和http协议学习
- 收藏一些很励志的东西,不想学习时来看一看
- 学习RecyclerView的一些东西
- 关于java学习的一些东西
- C++学习笔记—类6-有关继承的一些东西
- 最近写了一些东西,可以共同学习
- android一些新东西学习博客
- 最近加入了控件开发团队,发现一些基础的东西,转发上来方便大家学习(转)
- 想想学习C已经有9年了, 应该可以写一些东西了.——转
- 【学习】关于导数的一些东西
- 学习GTK时候临时记录的一些东西备忘
- hadoop学习之前的一些东西
- 给学习Java初学者一些个人感觉有用的东西
- 刚开始学习iphone时可能用到的一些东西
- 一位大师总结的东西---J2EE学习中一些值得研究的开源项目
- 准备重新学习一些东西