Unity | Shader基础知识(第十八集:Stencil应用-透视立方盒子)

目录

一、前言

二、场景布置

三、 shader部分

1.图片的部分

2.图片部分纯净代码

3.遮罩部分复习

4.深度写入 ZWrite

5.颜色遮罩ColorMask

6.遮罩纯净代码

四、场景中shader使用

五、作者的碎碎念


一、前言

因为这个内容稍微有点多,我尽力讲清楚了,如果不想看长篇大论的,可以直接下载成品。

上一集我们学了一个知识,叫做Stencil,这集我们把这部分知识扩展应用一下,做一个透视立方盒子。旋转到不同的面,展示不同的植物。这个植物可以是模型,也可以是图片。为了方便,我们用图片。(如图1所示)

图1 成品

二、场景布置

这个盒子是由6个quad的片组成的。把显示的面都放在里面,下方的quad加了草地的材质。(如图2所示)

图2 盒子墙

为了让盒子立体效果更好,在周围加了4个柱子,这四个柱子也只是cube拉长了。(如图3所示)

图3 柱子

因为我们展示了4个植物,所以也要放四个植物的图片,放在不同的方向,因为总要展示植物的正面。(如图4所示一个框一个植物)

图4 植物

最后也是最重要的,我们要沿着四周的墙建一圈遮罩(如图5所示),这个遮罩和墙大小一样,但注意墙的可见面是朝里的,但是遮罩的可见面是朝外的。因为你是从外面往里看,然后被遮住。

图5 遮罩

三、 shader部分

我们的shader分成两个,一个是挂在图片上的,一个是挂在遮罩上的。

1.图片的部分

根据之前学过的内容,图片部分就是之前美女图片的代码,链接如下。

Unity | Shader基础知识(第十七集:学习Stencil并做出透视效果)_unity stencil-CSDN博客

在这篇文章中,我们写了一个在遮罩后面才能看见的美女。不想回顾的,我把代码放在下面。

Shader "Custom/013-2"
{
Properties{_MainTex ("MainTex", 2D) = "white" {}}SubShader{Tags{"Queue" = "Transparent"}Stencil{Ref 1Comp EqualPass Keep}Cull OffCGPROGRAM#pragma surface surf Lambert alpha:fadesampler2D _MainTex;struct Input{float2 uv_MainTex;};void surf (Input IN, inout SurfaceOutput o){fixed4 c =tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

在上面的基础上,我们进行更改 。

需要更改的第一个部分,我们之前是在内部去设定测试模版的。(如图6所示)

图6 模版测试

但我们现在有4个树,每一个都在内部去改,我们就需要好多shader了,这样不方便,于是全部放到资源里。

    Properties{_MainTex ("MainTex", 2D) = "white" {}_SRef("Stencil Ref",Float) = 1_SComp("Stencil Comp",Float) = 8_SOp("Stencil Op",Float) = 2}

 然后在后面引用,只需要在原本的参数后面,书写中括号,再书写引用的符号,就可以了。

        Stencil{Ref[_SRef]Comp[_SComp]Pass[_SOp]}

这样我们就把参数改成外配的了!~


番外备注:

如果上一集你认真测试了,你会发现,总记不得等于到底是哪个,大于到底是哪个,如果有选项就好了,所以,unity为我们内置了选项,enum。

//选项    引用UnityEngine.Rendering.CompareFunction作为enum
[Enum(UnityEngine.Rendering.CompareFunction)] _SComp("Stencil Comp",Float) = 8
//选项    引用UnityEngine.Rendering.StencilOp作为enum
[Enum(UnityEngine.Rendering.StencilOp)] _SOp("Stencil Op",Float) = 2

这时候,你外面的材质球,对应的地方就会变成下拉选项。(如图7所示)

图7 下拉框

这样就方便多了!


因为我们的植物图片并不是一直显示,而是看见遮罩那一面的时候才显示,所以我们必须在遮罩后面渲染,因为遮罩打算放在Transparent层级,所以我们植物就比它晚一个点就行。

Tags
{
"Queue" = "Transparent+1"
}

到此为止,我们图片的所有更改都结束了。

2.图片部分纯净代码
Shader "Custom/014plant"
{Properties{_MainTex ("MainTex", 2D) = "white" {}_SRef("Stencil Ref",Float) = 1[Enum(UnityEngine.Rendering.CompareFunction)] _SComp("Stencil Comp",Float) = 8[Enum(UnityEngine.Rendering.StencilOp)] _SOp("Stencil Op",Float) = 2}SubShader{Tags{"Queue" = "Transparent+1"}Stencil{Ref[_SRef]Comp[_SComp]Pass[_SOp]}Cull OffCGPROGRAM#pragma surface surf Lambert alpha:fadesampler2D _MainTex;struct Input{float2 uv_MainTex;};void surf (Input IN, inout SurfaceOutput o){fixed4 c =tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}
3.遮罩部分复习

也是之前学过的内容,遮罩部分也就是之前的遮罩代码,链接如下。

Unity | Shader基础知识(第十七集:学习Stencil并做出透视效果)_unity stencil-CSDN博客

不想回顾的,我把代码放在下面。

Shader "Custom/013-1"
{
Properties{_MainTex ("MainTex", 2D) = "white" {}}SubShader{Tags{"Queue" = "Transparent-1"}Stencil{Ref 1Comp AlwaysPass replace}Cull OffCGPROGRAM#pragma surface surf Lambert alpha:fadesampler2D _MainTex;struct Input{float2 uv_MainTex;};void surf (Input IN, inout SurfaceOutput o){fixed4 c =tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

首先,我们依然把内置的模版测试改成外部可更改的,这部分略。之后我们需要学两个重要的知识点:深度写入和颜色遮罩。

4.深度写入 ZWrite

这个功能默认是开启的,也是一个非常好用的功能。

如果物体a被物体b挡住了,在大部分时候,我们是不需要去看物体a的,因为被挡住了,所以就看不见了。(如图8所示),方块的一部分,被平面挡住了。

图8 平面挡住方块

但是,你怎么知道方块在后面的?因为计算机检测了深度。如果此时把深度检测关了。计算机就觉得,大家都在第一面上,所以都显示。(如图9所示)

图9 关闭深度检测

 


我们进一步了解一下这个功能,在打开ZWrite时,如果它检测到物体是在前面的,并且,不是透明的(我设置不是透明,如图10所示)。计算机就会考虑,被一个不是透明的物体挡住了,那就不渲染了。所以这里不仅仅是看不见,而是它压根就不画了。

图10 

这里我们设置为普通物体(如图10所示),再打开深度写入,同时我们让前面的固体显示是透明的。就会出现(如图11所示)。后面的物体会以为自己挡住了,所以不画了,就会出现这个景象。

图11 以为自己被挡住

总结:

a.打开深度写入 ZWrite On

这时候,计算机会测试一下, 发现有谁是躲在后面的吗?干脆就不画这部分了

b.关闭了深度写入ZWrite Off

这时候,计算机不管你是否在后面,都会渲染。


5.颜色遮罩ColorMask

我们在unity里每次看图片,都有一个颜色通道功能。(如图12所示)

图12 颜色通道

在shader中,我们也自带了这个功能,我们可以选择只显示一个通道的内容。也可以选择都不显示。(就是前面我们深度写入中,虽然是物体,但做成了不显示的样子) 

标注了颜色遮罩,我们就可以选择只显示某一种或者某几种,或者不显示。

ColorMask RGBA        全部显示

ColorMask 0                全部关闭

ColorMask R                显示红色通道

ColorMask G                显示绿色通道 

ColorMask B                显示蓝色通道 

ColorMask A                显示透明通道 

ColorMask RG             显示红色和绿色通道

ColorMask RB             显示红色和蓝色通道

ColorMask RA             显示红色和透明通道

ColorMask GB             显示绿色和蓝色通道

ColorMask GA             显示绿色和透明通道

ColorMask BA             显示蓝色和透明通道

6.遮罩纯净代码

所以,我们的遮罩应该就是一个不显示的物体,要把颜色遮罩设置为0,但同时它不能挡住后面的花花草草,所以要把深度检测关了。

Shader "Custom/014"
{Properties{_MainTex ("MainTex", 2D) = "white" {}_SRef("Stencil Ref",Float) = 1[Enum(UnityEngine.Rendering.CompareFunction)] _SComp("Stencil Comp",Float) = 8[Enum(UnityEngine.Rendering.StencilOp)] _SOp("Stencil Op",Float) = 2}SubShader{Tags { "Queue" = "Geometry" }ZWrite offColorMask 0Stencil{Ref[_SRef]Comp[_SComp]Pass[_SOp]}CGPROGRAM#pragma surface surf Lambertsampler2D _MainTex;struct Input{float2 uv_MainTex;};void surf(Input IN,inout SurfaceOutput o){o.Albedo = tex2D (_MainTex, IN.uv_MainTex);}ENDCG}FallBack "Diffuse"
}

四、场景中shader使用

遮罩和图片的shader需要各自的材质并创建,这里我就略过了,直接进入参数配置。

我们的遮罩和植物图片应该是一一对应的。

对应植物1的遮罩:

植物1:

其他部分不变,其他植物使用不同的数就行,如3,4,5

这样就完成了所有的设置了。

五、作者的碎碎念

这集设置场景的部分比较多,但shader代码和之前差距不大哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac拆分pdf mac如何拆分pdf成多个文件

在数字化办公日益普及的今天,pdf文件因其良好的兼容性和便捷性,已经成为工作和学习中的重要文件格式。然而,有时候我们可能会遇到需要将一个大的pdf文件拆分成多个小文件的情况,以便于管一理和分享。本文将为您详细介绍两种简单易…

MySQL 和 PostgreSQL,我到底选择哪个?

MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统(RDBMS)。它们都具有强大的功能和广泛的社区支持,但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL,包括它们的特点、性能、扩展性、安全性以及适用场景等…

文献阅读:tidyomics 生态系统:增强组学数据分析

文献介绍 文献题目: The tidyomics ecosystem: enhancing omic data analyses 研究团队: Stefano Mangiola(澳大利亚沃尔特和伊丽莎霍尔医学研究所)、Michael I. Love(美国北卡罗来纳大学教堂山分校)、Ant…

virtualbox的ubuntu默认ipv4地址为10.0.2.15的修改以及xshell和xftp的连接

virtualbox安装Ubuntu后,默认的地址为10.0.2.15 我们查看virtualbox的设置发现是NAT 学过计算机网络的应该了解NAT技术,为了安全以及缓解ip使用,我们留了部分私有ip地址。 私有IP地址网段如下: A类:1个A类网段&…

hexo搭建博客(github node git )(失败版本)

HexoGitHub搭建个人博客教程(2023最新版) 搭建失败了 是因为git命令一直报错 打算明天把git和node版本全部重新安装后再弄 同时回顾一下github git 和 node的基础知识 Github新手之路(全过程)(站在前辈的肩膀上的总…

Template_C++

C模板 C提供了function template. function template:实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用的函数就称为函数模版。 是不是可以这样理解,函数模版就是给了一种功能&…

pytorch学习(四)绘制loss和correct曲线

这一次学习的时候静态绘制loss和correct曲线,也就是在模型训练完成后,对统计的数据进行绘制。 以minist数据训练为例子 import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvisi…

【zabbix6监控java-tomcat全流程】

目录 一、监控主机安装zabbix-server1、zabbix的安装2、配置数据库3、为zabbix server配置数据库4、启动服务,web界面安装 二、被监控主机安装tomcat1、安装JDK2、安装tomcat 三、zabbix的服务端安装zabbix-java-gateway四、被监控主机tomcat的配置五、web界面添加主机 一、监控…

使用 Web APi - MediaRecorder 获取麦克风资源,报错:Cannot find name ‘MediaRecorder‘ 的解决方法

目录 一、背景: 二、具体解决方法 一、背景: angular 调用 MediaRecorder 来使用麦克风获取声音,(具体要求:angular 前端 按键调用 麦克风,松开按键生成音频文件)代码如下(来自通…

【树莓派3B+】控制引脚输出高低电平

前言一、安装RPI.GPIO库二、编写简单的输出高低电平的程序三、运行程序总结 前言 首先检查一下自己的板子有没有带库 我这个是有的。 ok,正式进入步骤 一、安装RPI.GPIO库 如果还没有安装RPi.GPIO库,可以通过以下命令在树莓派上安装: p…

Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试

仅仅是个人搭建记录 参考链接: https://zhuanlan.zhihu.com/p/686439920 仿真平台基础配置(对应PX4 1.13版) 语雀 mkdir -p ~/tzb/catkin_ws/src mkdir -p ~/tzb/catkin_ws/scripts cd catkin_ws && catkin init catkin build cd…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

实战:详解Spring创建bean的流程(图解+示例+源码)

概叙 这篇主要总结Spring中bean的创建过程,主要分为加载bean信息–>实例化bean–>属性填充–>初始化阶段–>后置处理等步骤,且每个步骤Spring做的事情都很多,这块源码还是很值得我们都去看一看的。而Spring中Bean的声明周期其实…

GEO数据挖掘从数据下载处理质控到差异分析全流程分析步骤指南

0. 综合的教学视频介绍 GEO数据库挖掘分析作图全流程每晚11点在线教学直播录屏回放视频: https://www.bilibili.com/video/BV1rm42157CT/ GEO数据从下载到各种挖掘分析全流程详解: https://www.bilibili.com/video/BV1nm42157ii/ 一篇今年近期发表的转…

捷配总结的SMT工厂安全防静电规则

SMT工厂须熟记的安全防静电规则! 安全对于我们非常重要,特别是我们这种SMT加工厂,通常我们所讲的安全是指人身安全。 但这里我们须树立一个较为全面的安全常识就是在强调人身安全的同时亦必须注意设备、产品的安全。 电气: 怎样预…

IDEA 调试 Ja-Netfilter

首先本地需要有两款IDEA 可以是相同版本,也可以是不同版本。反正要有两个,一个用来调试代码,一个启动。 移除原有ja-netfiler 打开你的ja-netfiler的vmoptions目录,修改其中的idea.vmoptions文件。移除最后一行-javaagent ...参…

分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法

前言 树形结构是一种很常见的数据结构,类似于现实生活中的树的结构,具有根节点、父子关系和层级结构。 所谓根节点,就是整个树的起始节点。 节点则是树中的元素,每个节点可以有零个或多个子节点,节点按照层级排列&a…

AI智能名片S2B2C商城小程序在社群去中心化管理中的应用与价值深度探索

摘要:随着互联网技术的飞速发展,社群经济作为一种新兴的商业模式,正逐渐成为企业与用户之间建立深度连接、促进商业增长的重要途径。本文深入探讨了AI智能名片S2B2C商城小程序在社群去中心化管理中的应用,通过详细分析社群去中心化…

【DGL系列】DGLGraph.out_edges简介

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 函数说明 用法示例 示例 1: 获取所有边的源节点和目标节点 示例 2: 获取特定节点的出边 示例 3: 获取所有边的边ID 示例 4: 获取所有信息&a…

中国机器视觉行业上市公司市场竞争格局分析

中国机器视觉产业上市公司汇总:分布在各产业链环节 机器视觉就是用机器来代替人眼做测量和判断的系统,机器检测相较于人工视觉检测优势明显。目前,我国机器视觉产业的上市公司数量较多,分布在各产业链环节。具体包括:…