日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity - 手动创建 dithering tex 3d

發布時間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 中標記位置

// jave.lin 2022/11/02 參考:https://docs.unity3d.com/cn/2020.3/Manual/class-Texture3D.htmlusing 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 wraptexture.filterMode = FilterMode.Point;texture.wrapMode = TextureWrapMode.Repeat;// 將更改應用到紋理,然后將更新的紋理上傳到 GPUtexture.Apply();// 將紋理保存到 Unity 項目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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。