生活随笔
收集整理的這篇文章主要介紹了
Unity - 手动创建 dithering tex 3d
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 環境
- 手動創建 dithering tex 3d
- TextureViewShader
- TextureViewShader - 使用 unity 內置的 _DitherMaskLOD
- TextureViewShader - 使用 自定義的 MyDitheringTex3D
- 效果
最近工作忙成狗
一直沒有時間充電
后續制作半透明陰影時,可以用到 dithering 來 clip shadow caster + soft shadow 來實現
所以提前搞一下 dithering tex 3d 的創建
環境
Unity : 2020.3.37f1
Pipeline : BRP
手動創建 dithering tex 3d
手動在 PS 中標記位置
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;public class ExampleEditorScript : MonoBehaviour
{[MenuItem("CreateExamples/3DTexture")]static void CreateTexture3D(){const int width
= 4, heigh
= 4, depth
= 16;TextureFormat format
= TextureFormat
.RGBA32
;TextureWrapMode wrapMode
= TextureWrapMode
.Clamp
;Texture3D texture
= new Texture3D(width
, heigh
, depth
, format
, false);texture
.wrapMode
= wrapMode
;Color[] colors
= new Color[width
* heigh
* depth
];const int one_depth_count
= width
* heigh
;Color[] depth0_cols
= new Color[one_depth_count
] {Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,};Color[] depth1_cols
= new Color[one_depth_count
]{Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.white
, Color
.white
,};Color[] depth2_cols
= new Color[one_depth_count
]{Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.white
, Color
.white
, Color
.black
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.white
, Color
.white
,};Color[] depth3_cols
= new Color[one_depth_count
]{Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.white
, Color
.white
,};Color[] depth4_cols
= new Color[one_depth_count
]{Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,};Color[] depth5_cols
= new Color[one_depth_count
]{Color
.white
, Color
.white
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,Color
.white
, Color
.black
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,};Color[] depth6_cols
= new Color[one_depth_count
]{Color
.white
, Color
.white
, Color
.white
, Color
.black
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,Color
.white
, Color
.black
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,};Color[] depth7_cols
= new Color[one_depth_count
]{Color
.white
, Color
.black
, Color
.white
, Color
.black
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,Color
.white
, Color
.black
, Color
.white
, Color
.white
,Color
.black
, Color
.white
, Color
.black
, Color
.white
,};Color[] depth8_cols
= new Color[one_depth_count
]{Color
.black
, Color
.white
, Color
.black
, Color
.white
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,Color
.black
, Color
.white
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,};Color[] depth9_cols
= new Color[one_depth_count
]{Color
.black
, Color
.black
, Color
.black
, Color
.white
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,Color
.black
, Color
.white
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,};Color[] depth10_cols
= new Color[one_depth_count
]{Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,Color
.black
, Color
.white
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,};Color[] depth11_cols
= new Color[one_depth_count
]{Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,};Color[] depth12_cols
= new Color[one_depth_count
]{Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.white
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.black
, Color
.black
,};Color[] depth13_cols
= new Color[one_depth_count
]{Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.black
, Color
.black
, Color
.white
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.black
, Color
.black
,};Color[] depth14_cols
= new Color[one_depth_count
]{Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.white
, Color
.black
, Color
.black
, Color
.black
,};Color[] depth15_cols
= new Color[one_depth_count
]{Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,Color
.black
, Color
.black
, Color
.black
, Color
.black
,};List<Color[]> datas
= new List<Color[]>();datas
.Add(depth0_cols
);datas
.Add(depth1_cols
);datas
.Add(depth2_cols
);datas
.Add(depth3_cols
);datas
.Add(depth4_cols
);datas
.Add(depth5_cols
);datas
.Add(depth6_cols
);datas
.Add(depth7_cols
);datas
.Add(depth8_cols
);datas
.Add(depth9_cols
);datas
.Add(depth10_cols
);datas
.Add(depth11_cols
);datas
.Add(depth12_cols
);datas
.Add(depth13_cols
);datas
.Add(depth14_cols
);datas
.Add(depth15_cols
);datas
.Reverse(); for (int i
= 0; i
< depth
; i
++){Array
.Copy(datas
[i
], 0, colors
, i
* one_depth_count
, one_depth_count
);}texture
.SetPixels(colors
);texture
.filterMode
= FilterMode
.Point
;texture
.wrapMode
= TextureWrapMode
.Repeat
;texture
.Apply();AssetDatabase
.CreateAsset(texture
, "Assets/Textures/Example3DTexture.asset");}
}
創建完后的 texture 3d
TextureViewShader
TextureViewShader - 使用 unity 內置的 _DitherMaskLOD
Shader
"Custom/TextureViewShader"
{Properties
{_UV_Scale ("UV Scale", Float
) = 16_TargetDepth ("Target Depth", Int
) = 1}SubShader
{Tags
{ "RenderType"="Opaque" }LOD
100Pass
{CGPROGRAM
#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex
: POSITION
;float2 uv
: TEXCOORD0
;};struct v2f{float4 vertex
: SV_POSITION
;float2 uv
: TEXCOORD0
;};sampler3D _DitherMaskLOD
;half _UV_Scale
;int _TargetDepth
;v2f
vert (appdata v
){v2f o
;o
.vertex
= UnityObjectToClipPos(v
.vertex
);o
.uv
= v
.uv
;return o
;}fixed4
frag (v2f i
) : SV_Target
{i
.uv
*= _UV_Scale
;fixed4 col
= tex3D(_DitherMaskLOD
, float3(i
.uv
, floor(_TargetDepth
) * 0.0625)).a
;return col
;}ENDCG
}}
}
TextureViewShader - 使用 自定義的 MyDitheringTex3D
Shader
"Custom/TextureViewShader1"
{Properties
{_MyDitheringTex3D ("My Dithering Tex 3D", 3D
) = "white" {}_UV_Scale ("UV Scale", Float
) = 16_TargetDepth ("Target Depth", Int
) = 1}SubShader
{Tags
{ "RenderType"="Opaque" }LOD
100Pass
{CGPROGRAM
#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex
: POSITION
;float2 uv
: TEXCOORD0
;};struct v2f{float4 vertex
: SV_POSITION
;float2 uv
: TEXCOORD0
;};sampler3D _MyDitheringTex3D
;half _UV_Scale
;int _TargetDepth
;v2f
vert (appdata v
){v2f o
;o
.vertex
= UnityObjectToClipPos(v
.vertex
);o
.uv
= v
.uv
;return o
;}fixed4
frag (v2f i
) : SV_Target
{i
.uv
*= _UV_Scale
;fixed4 col
= tex3D(_MyDitheringTex3D
, float3(i
.uv
, floor(_TargetDepth
) * 0.0625)).r
;return col
;}ENDCG
}}
}
效果
左邊是 unity 知道的,右邊的是我們自己創建的 dithering tex 3d
總結
以上是生活随笔為你收集整理的Unity - 手动创建 dithering tex 3d的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。