【Unity】URP 中的 UGUIShader 实现

参考官方 Shader 代码实现:

https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/DefaultResourcesExtra/UI/UI-Default.shader

Shader "UI/Template"
{
Properties
{
// PerRendererData 表明纹理由每个渲染器提供,似乎是起某种优化作用。
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Tint", Color) = (1,1,1,1) _StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0
_StencilWriteMask ("Stencil Write Mask", Float) = 255
_StencilReadMask ("Stencil Read Mask", Float) = 255 _ColorMask ("Color Mask", Float) = 15 // 启用Clip功能,Clip掉的像素将不会参与模板测试等。
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
}
SubShader
{
LOD 100 //内置无光照系列Shader的LOD一般为100
Tags
{
"Queue"="Transparent" // 渲染顺序为透明队列
"PreviewType"="Plane" // 材质预览效果为平面
"RenderType"="Transparent" // 渲染类型为透明
"CanUseSpriteAtlas"="True" // 表明兼容 LegacySpritePacker 图集功能。
"IgnoreProjector"="True" // 表明不受内置管线中投影器功能的影响。
} //UI利用模板功能实现遮罩效果
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
} //渲染器将自动排序,再加上UI都是半透明物体,所以无需深度功能
ZWrite Off
ZTest [unity_GUIZTestMode] // unity_GUIZTestMode 根据当前画布的渲染模式自动设置 Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask] Pass
{
HLSLPROGRAM
#pragma vertex VertexPass
#pragma fragment PixelPass
#pragma shader_feature _ UNITY_UI_ALPHACLIP
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" cbuffer UnityPerMaterial
{
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Color;
} struct Vertex
{
float3 positionOS:POSITION;
float4 color : COLOR;
float2 uv:TEXCOORD0;
}; struct Pixel
{
float4 positionCS:SV_POSITION;
float4 color : COLOR;
float2 uv:TEXCOORD0;
}; Pixel VertexPass(const Vertex vertex)
{
Pixel pixel;
pixel.positionCS = TransformObjectToHClip(vertex.positionOS);
pixel.color = vertex.color * _Color;
pixel.uv = TRANSFORM_TEX(vertex.uv, _MainTex);
return pixel;
} float4 PixelPass(const Pixel pixel):SV_TARGET
{
float4 color = tex2D(_MainTex, pixel.uv) * pixel.color;
#ifdef UNITY_UI_ALPHACLIP
clip (pixel.color.a - 0.001);
#endif
return color;
}
ENDHLSL
}
}
}

【Unity】URP中的UGUIShader实现的更多相关文章

  1. i3D的一篇Unity教程中的笔记

    原地址:http://blog.sina.com.cn/s/blog_72b936d80100wwej.html 以下是i3D的一篇Unity教程中的笔记. i3D的这篇教程是[i3D.Next-Ge ...

  2. [译]如何在Unity编辑器中添加你自己的工具

    在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作 ...

  3. 关于Unity项目中创建项目遇到的一些问题

    1.Unity调用Android的方法默认不是在UI线程执行,所以在Android上写一些页面的重绘的方法,让Unity去调用时,注意要在Android中添加对应的runOnUiThread才可以: ...

  4. 【Unity优化】如何实现Unity编辑器中的协程

    Unity编辑器中何时需要协程 当我们定制Unity编辑器的时候,往往需要启动额外的协程或者线程进行处理.比如当执行一些界面更新的时候,需要大量计算,如果用户在不断修正一个参数,比如从1变化到2,这种 ...

  5. 在Unity 3D中加入Image图片

    在Unity 3D中加入Image图片,我在刚开始是加不进去的,为什么呢?因为没有图片,图如下: 原因就是我们没有把图片设置为Script,图片的格式还是默认的那个,这只能作为贴图使用.我们将图片进行 ...

  6. Unity 3D中的阴影设置

    在Unity 3D中,经常需要用到光照阴影,即Directional Light的Shadow,Shadow分为Hard Shadow和Soft Shadow.区别是Soft Shadow的阴影边缘比 ...

  7. Unity 3D中不得不说的yield协程与消息传递

    1. 协程 在Unity 3D中,我们刚开始写脚本的时候肯定会遇到类似下面这样的需求:每隔3秒发射一个烟花.怪物死亡后20秒再复活之类的.刚开始的时候喜欢把这些东西都塞到Update里面去,就像下面这 ...

  8. MVVM框架在unity开发中的使用

    1.什么是MVVM 借用一下百度百科上对MVVM的介绍,MVVM是Model-View-ViewModel的简写,它本质上就是MVC 的改进版.MVVM 就是将其中的View 的状态和行为抽象化,让我 ...

  9. 在Unity场景中更改天空盒的步骤

    一.介绍 目的:在Unity场景中制作一个天空盒. 软件环境:Unity 2017.3.0f3,VS2013. 参考 skybox 二.自制一个天空盒 1,创建一个材质material 2,更改属性为 ...

  10. 在Unity场景中控制日夜的轮转

    一.介绍 目的:通过在Unity场景中添加C#脚本完成日夜轮转的效果. 软件环境:Unity 2017.3.0f3,VS2013 二.操作过程 通过拖拽场景中的Directional Light我们知 ...

随机推荐

  1. 多线程编程入门Thread_Task_async_await简单秒懂

    ` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u ...

  2. cv2, pil.image, plt.image 读图的差异

    人是习惯性动物,当我们第一次用opencv时,肯定会觉得opencv的imread()方式很奇怪,做图像出来天天说图像是RGB图RGB图,可opencv读出来的图,却是BGR的顺序.是不是很奇怪,还不 ...

  3. 【Amadeus原创】Docker容器的备份与还原

    主要作用: 就是让配置好的容器,可以得到复用,后面用到得的时候就不需要重新配置. 其中涉及到的命令有: docker commit 将容器保存为镜像 docker save -o 将镜像备份为tar文 ...

  4. JEP 457 Java 22:Class-File API

    查看 Java 22:Class-File API | 作者:Ben Weidig | 2024 年 4 月 | Medium 终于有一个和 DLR 相当的官方库了.

  5. T语言开发笔记1

    为什么会有开发语言的想法 在2012年,我准备开发一个给前端切图使用的屏幕取色器. 需求很简单,前端经常需要获取设计稿特定位置的颜色代码.虽然当时 PhotoShop 提供了内部取色器,但操作麻烦,而 ...

  6. Write failed: Broken pipe > Couldn‘t read packet: Connection reset by peer SFTP服务器连接出现的问题

    如果你链接服务器的时候出现下面的提示: Write failed: Broken pipeCouldn't read packet: Connection reset by peer这个问题的原因是C ...

  7. Qt音视频开发6-ffmpeg解码处理

    一.前言 采用ffmpeg解码,是所有视频监控开发人员必备的技能,绕不过去的一个玩意,甚至可以说是所有音视频开发人员的必备技能.FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开 ...

  8. Diffusion Model-Stable Diffusion(一)

    Stable Diffusion 是一个基于扩散模型的图像生成模型,可以用于生成高质量图像.其传统实现主要基于 PyTorch,最常用的开源实现是 CompVis/stable-diffusion 和 ...

  9. RAG实践 - AI 知识库问答功能的建设

    最近在工作中构建了一套自动的基于文档中心为数据集构建知识库 AI 问答的系统,来提升用户体验和技术支持效率,分享一下在实现过程中的技术选型和架构设计. 背景 先说下背景,我们公司的产品 FinClip ...

  10. 解决git clone 速度慢的问题

    解决git clone 速度慢的问题 1.原因 git clone特别慢是因为github.global.ssl.fastly.net域名被限制了. 只要找到这个域名对应的ip地址,然后在hosts文 ...