• Unity - 手动创建 dithering tex 3d



    最近工作忙成狗
    一直没有时间充电
    后续制作半透明阴影时,可以用到 dithering 来 clip shadow caster + soft shadow 来实现

    所以提前搞一下 dithering tex 3d 的创建


    环境

    Unity : 2020.3.37f1
    Pipeline : BRP


    手动创建 dithering tex 3d

    在这里插入图片描述

    手动在 PS 中标记位置
    在这里插入图片描述

    在这里插入图片描述

    // jave.lin 2022/11/02 参考:https://docs.unity3d.com/cn/2020.3/Manual/class-Texture3D.html
    
    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;
    
            // 创建 3 维数组以存储颜色数据
            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(); // 添加了 Reverse 的效果就等同于: unity shader 中的 _DitherMaskLOD 效果
    
            for (int i = 0; i < depth; i++)
            {
                Array.Copy(datas[i], 0, colors, i * one_depth_count, one_depth_count);
            }
    
            // 将颜色值复制到纹理
            texture.SetPixels(colors);
    
            // jave.lin : 用于 dithering 的话,建议使用 point filter, repeat wrap
            texture.filterMode = FilterMode.Point;
            texture.wrapMode = TextureWrapMode.Repeat;
    
            // 将更改应用到纹理,然后将更新的纹理上传到 GPU
            texture.Apply();
    
            // 将纹理保存到 Unity 项目
            AssetDatabase.CreateAsset(texture, "Assets/Textures/Example3DTexture.asset");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176

    创建完后的 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 100
            Pass
            {
                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
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    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 100
            Pass
            {
                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
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    效果

    在这里插入图片描述

    左边是 unity 知道的,右边的是我们自己创建的 dithering tex 3d
    请添加图片描述

  • 相关阅读:
    一类综合的模糊化自适应滑模控制
    基于深度学习的合成孔径雷达自聚焦
    更新暑假做过的项目(医学数据多标签分类与多标签分割,医学数据二分类)
    23种设计模型
    sklearn学习笔记之线性回归
    调试MT9V024
    【C++进阶】特殊类设计
    WPF:xaml语言【万字基础】
    Spring Boot + Docker实战
    无人机--行业生命周期分析
  • 原文地址:https://blog.csdn.net/linjf520/article/details/127660255