文章目录

  • 环境
  • 手动创建 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相关推荐

  1. Unity VR中实现播放3D电影

    3D电影的原理 今天要在unity中借用steamVR观赏3D电影,之前没有留意过3D电影相关,完全没有思路,于是先百度了一下3D电影的原理. 很久之前看过几次3D电影,那时候比较新奇,当时中途摘下过 ...

  2. 学习在Unity中创建一个动作RPG游戏

    游戏开发变得简单.使用Unity学习C#并创建您自己的动作角色扮演游戏! 你会学到什么 学习C#,一种现代通用的编程语言. 了解Unity中2D发展的能力. 发展强大的和可移植的解决问题的技能. 了解 ...

  3. Unity粒子系统创建VFX游戏特效学习教程 Visual Effects in Unity Particle Systems [Beginner’s Guide]

    在Unity中学习高级粒子系统和视觉效果创建.初级到中级 你会学到: 游戏的视觉效果 Unity粒子系统 Unity中的Vfx 创建Unity视觉效果的初级到中级指南 课程获取:Unity粒子系统创建 ...

  4. 学会在Unity中创建一个Match-3益智游戏 Learn To Create a Match-3 Puzzle Game in Unity

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:48场讲座(6h 38m) |大小解压后:2.8 G ...

  5. Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity

    Unity中创建本地多人游戏完整案例视频教程 Learn To Create A Local Multiplayer Game In Unity MP4 |视频:h264,1280x720 |音频:A ...

  6. 手动创建线程池 效果会更好_创建更好的,可访问的焦点效果

    手动创建线程池 效果会更好 Most browsers has their own default, outline style for the :focus psuedo-class. 大多数浏览器 ...

  7. unity中创建游戏场景_在Unity中创建Beat Em Up游戏

    unity中创建游戏场景 Learn how to use Unity to create a 3D Beat Em Up game in this full tutorial from Awesom ...

  8. Unity/Animator -- 创建Animator Controller

    前言 在Unity里,我们可以自己制作动画效果, 亦或是使用别人制作好的动画素材,为模型和UI赋予活力.然而,通常情况下,一个单独的动画(即Animation Clip)可能无法很好地达到我们期望的效 ...

  9. unity 如何创建六边形地图

    要在 Unity 中创建六边形地图,可以进行以下步骤: 创建一个空的 Unity 项目,并在场景中创建一个空的 GameObject. 在 GameObject 上添加 MeshFilter 和 Me ...

最新文章

  1. 学数学,你要如何过题海:游泳?冲浪?划小船?开游艇?
  2. Linux内核同步机制之(四):spin lock【转】
  3. 王者荣耀中有哪些获胜率高的玩法?
  4. Vue002_计算属性和监视
  5. JavaScript创建命名空间
  6. 8.0强行转换后变成了7_血糖7至8正常吗?控制标准不能一概而论,看你的血糖应该在多少...
  7. 案例 网络电视精灵 c# 1614265410
  8. java将图片传给页面,java将图片传为设定编码值显示(可做刺绣)
  9. Matlab仿真产生复高斯白噪声,验证包络服从瑞利分布,包络平方服从指数分布
  10. 个性化Unity游戏开发环境两则
  11. kafka查看消费位置
  12. 现在被apihook搞郁闷了.....进展很慢...先放上几个必用的api说明吧.
  13. html自动调用js函数,使用HTML按钮调用JavaScript函数
  14. PCIE知识点-003:PCIE协议中的upstream概念
  15. 【PS功能学习】10:蒙版带你领略台前幕后的故事
  16. 手机怎么把游戏隐藏在计算机里,怎么把手机游戏投屏到电脑?
  17. LTE/LTE-Advanced 第2章 网络架构
  18. Springboot----实现邮箱验证码登录(代码部分)
  19. 【微信小程序控制硬件④】 深度剖析微信公众号配网 Airkiss 原理与过程,esp8266如何自定义回调参数给微信,实现绑定设备第一步!(附带源码)
  20. This computer doesn’t have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory“!

热门文章

  1. uni-app 自定义选择日期2(2021-09-16)
  2. 怎样在Mysql中直接储存图片(转)
  3. 斜线/、反斜线\、双斜线//、双反斜线\\——详解
  4. 第一性原理吸附能计算的基本原理及应用领域分析
  5. datagridview删除第一列空白
  6. java计算机毕业设计旅游服务平台源代码+数据库+系统+lw文档
  7. 在局域网中访问共享文件时,提示“引用的帐户当前已锁定,且可能无法登录”...
  8. 兔子生兔子之递归问题(递归实现斐波那契数列)
  9. ping命令流程详解
  10. 4.门锁系统——卡片识别