Unity 透视镜效果 shader模板测试实现 shader学习杂记(一)

2023-10-27

1、透视镜效果示例

场景中创建了三个物体,一个方块、一堵墙、一个球体
然后创建三个材质球、三个初始的shader,将三个shader分别拖给三个材质球
再把材质球拖给三个物体,给这三个物体红色、蓝色、绿色,便于观察

看一下以红色方块为透视镜看过去的效果:
Game视图:

可以很明显的看到,通过红色方块的区域可以透过墙体看到绿色球体。

2、效果实现
透视效果其实就是通过模板测试来实现,以红色方块为遮罩,给三个shader添加相同模板值,再将球体通过模板测试就可以了。
具体步骤: 打开创建的三个初始shader,找到pass,添加模板测试

//cube.shader  红色方块
 Pass
        {
		Stencil
			{
                Ref 2 //模板值给一个2,三个物体模板值都必须相同
                Comp always//表示在模板测试中总是通过
                Pass replace//作为遮罩物
            }
//wall.shader  蓝色墙体
Pass
        {
			Stencil
			{
                Ref 2 
                Comp NotEqual//不通过模板测试
            }
//sphere.shader  绿色球体
Pass
        {
			Stencil
			{
                Ref 2 
                Comp Equal//通过模板测试
            }

现在来看一下效果:

你会发现能看见红色方块,不能透它过去看绿色球体,这是因为在模板测试中,方块给的是Comp always,球体给的是Comp Equal,它们两个都会通过模板测试,所以都会写入缓冲区,并且只显示离摄像机更近的物体。
所以我们需要在cube.shader的pass里加一句代码:ZWrite Off

 Pass
        {
		Stencil
			{
                Ref 2 //模板值给一个2,三个物体模板值都必须相同
                Comp always
                Pass replace
            }
			ZWrite Off//不写入缓冲区

现在再来看一下效果:

现在已经实现了透视效果。

引发了额外的问题
现在在游戏中直接去看球体时,是看不见的:

这是因为通过了模板测试之后就不会在透视范围以外的缓冲区写入,解决的方法很简单,那就是将它的pass代码复制一份就可以了,也就是一个shader中有两个pass,但是复制的pass代码要将里面的测试模板代码删掉,也就是Stencil代码,这样就能在游戏中直接观察到物体了

3、模板测试原理简述
模板测试可以理解为将缓冲区分为了两个,一个是遮罩物体所在的范围,另一个就是遮罩物体以外的范围,上文例子中的两个范围,如图:

将各种情况总结为一张表格:
在下表中暂且将
遮罩物体所在范围的缓冲区称作:内缓冲区
遮罩物体以外范围的缓冲区称作:外缓冲区

是否作为遮罩物 是否通过模板测试 写入缓冲区情况
会写入内、外缓冲区
不会写入内缓冲区,会写入外缓冲区
会写入内缓冲区,不会写入外缓冲区
不会写入内缓冲区,会写入外缓冲区

利用这些原理就能实现简单透视效果,如果要实现类似X—ray的半透视效果,那就要深入学习渲染队列的控制。
本文就到这儿了,欢迎大家来点评!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 透视镜效果 shader模板测试实现 shader学习杂记(一) 的相关文章

  • Counter-strike 2游戏网站网页制作设计 基于html+css 使用HTML+CSS+JavaScript完成以下任务: 1.使用WebStorm建立和管理个人网站; 2.熟练使用CSS结

    Counter strike 2游戏网站网页制作设计 基于html css Counter strike 2游戏网站网页制作设计 基于html css网页项目的设计与实现 https www bilibili com video BV1Kw
  • OpenGL 二进制程序格式是否标准化?

    我一直在谷歌上搜索 OpenGL 二进制格式及其实际含义 到目前为止我还没有取得太大的成功 我知道我可以按如下方式获取数量和格式集 glGetIntegerv GL PROGRAM BINARY FORMATS values 0 其中 va
  • OpenGL ES - 在片段着色器中旋转纹理而不失真

    我正在使用 Android 的 GPUImage 库对位图应用一些效果 本质上 GPUImage接受位图并使用OpenGL ES 将1 x 1立方体渲染到位图大小的帧缓冲区中 用户可以编写自定义片段着色器来控制输出 我正在尝试编写一个片段着
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接
  • 申泰勇教练的独家人物化身系列即将登陆 The Sandbox

    申泰勇 Shin Tae yong 教练是足球界的传奇人物 他来到 The Sandbox 推出了自己的专属人物化身系列 作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练 他的传奇经历现在已经影响到了虚拟世界 向过去 现在和未来致敬
  • 为 webgl 中的每个对象使用不同的顶点和片段着色器

    我在 webgl 中有一个包含多个对象的场景 对于每个对象 我想使用不同的顶点和片段着色器 我的第一个问题是 是否可以为每个对象都有一个着色器 我知道在 opengl 中这是可能的 这是与我的想法类似的伪代码 任何例子将不胜感激 glena
  • 2024年华为OD机试真题-虚拟游戏理财-Python-OD统一考试(C卷)

    题目描述 在一款虚拟游戏中生活 你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局 现有一家Bank 它提供有若干理财产品m 风险及投资回报不同 你有N 元 进行投资 能接受的总风险值为X 你要在可接受范围内选择最优的投资方式获得最大回报
  • 着色器使立方体的边缘倾斜?

    这个问题涉及使用着色器 可能在 Unity3D 环境中 但 Metal 或 OpenGL 都可以 以在网格最小立方体上实现圆角边缘 我希望只使用 12 个三角形的简约网格立方体 然后通过着色器 使每个块的边缘 角 稍微倾斜 其实这样可以吗带
  • Unity3D - 用于精灵裁剪的着色器

    我正在尝试创建一个可用于在游戏中剪辑 2D 精灵的着色器 我在中找到了该着色器另一个问题 https stackoverflow com questions 16397023 unity3d a shader that will clip
  • WPF 着色器效果 - 抗锯齿不显示

    我遇到一个问题 我有一个 WPF 着色器效果 由 Rene Schulte 修改 来模拟点阵显示 DMD 一切都很好 但所有的点都是别名的 See attached image 我尝试了WPF中的许多功能 以带来抗锯齿 但无济于事 在构造函
  • 使用 texelFetch() 进行纹理化

    当我将非最大值传递到纹理缓冲区时 在渲染时它会绘制具有最大值颜色的几何图形 我在使用 glTexBuffer API 时发现了这个问题 例如 假设我的纹理数据是GLubyte 当我传递任何小于255的值时 那么颜色与用255绘制的颜色相同
  • OpenGL 实现多通道

    我在移植一些已成功实现的代码时遇到问题着色玩具 https www shadertoy com view XdyfWK对于桌面 OpenGL 问题是我需要创建一个 FrameBufferObject FBO 以便我可以进行离屏计算 稍后将其
  • 为什么我不能使用uniform1f而不是uniform4f来设置vec4制服?

    我通过以下方式逐步学习WebGL这本书 https sites google com site webglbook 我尝试通过使用缓冲区来绘制三个点 gl ARRAY BUFFER 而不是循环 正如我之前在本书的其他示例中所做的那样 var
  • 在Unity中如何使两个精灵的重叠区域透明?

    在Unity中如何使两个精灵的重叠区域透明 你能写一个关于它的着色器吗 经过一些研究 我了解到我应该使用模板缓冲区 但我不知道如何使用 这对我来说至关重要 我必须在 6 天内完成这个学校项目 请帮忙 示例图片 就这样 请记住这是我第一次使用
  • 使用着色器创建模糊过滤器 - 从片段着色器访问相邻像素?

    我想使用 OpenGL ES 2 0 中的片段着色器创建模糊效果 我感兴趣的算法只是一个平均模糊 将所有相邻像素添加到我自己中并除以 9 进行标准化 但是我有两个问题 1 这是否需要我首先渲染到帧缓冲区 然后切换渲染目标 或者有更简单的方法
  • 如何在 WebGL 中创建合适的圆角矩形?

    我试图实现答案这个问题 https stackoverflow com questions 43970170 bordered rounded rectangle in glsl但似乎有点问题 如果您打开他们的 ShaderToys 并尝试
  • Unity3D:在 AA 解析后绘制粒子以提高性能

    我正在尝试评估 MSAA 对 Unity 中含有大量粒子的场景的影响 为此 我需要 使用 8x MSAA 绘制场景中的所有非粒子对象 使用上一个通道中解析的深度缓冲区来渲染所有 将非遮挡粒子系统转移到较小的渲染目标上 将 2 的颜色缓冲区与

随机推荐

  • Linux 之exit() 进程退出函数

    进程的退出 linux下进程数量太多会导致系统崩溃 在使用完一个进程之后要及时终止它 进程退出一般有三种方法 1 在main函数中使用 return关键字 使用 return 后系统会调用 exit 函数来终止进程 2 手动调用 exit
  • C++ 关于 protobuf的一些操作

    先是定义部分 下面跟一些例子组成 message DBRoleData uint64 RoleID 2 string Name 6 repeated int64 Action 12 存内置重复单位 message DBRoleLoginAc
  • Kylin 10 SP1(UI)磁盘自行配置lvm

    1 登录服务器 输入 lsblk 查看新磁盘名称 我以sdb为例 sdb1是我为其建立的分区 2 新建分区 fidsk dev sdb 先输入n 新建分区 然后输入p 建立分区 其余选项默认 最后一步输入w保存 3 格式化分区 mkfs x
  • strapi的使用(二)-- Graphql

    一 Graphql 一种为你的API而生的查询语言 可以理解为动态api 一般来说我们都是在后端写好sql查询语句查询数据库数据 前端请求这个api返回的数据是固定的 而Graphql可以让前端去决定请求什么字段回来 二 strapi安装G
  • OPENSSL库的使用-RSA篇

    一 RSA算法简介 RSA公钥加密算法是1977年由Ron Rivest Adi Shamirh和LenAdleman在 美国麻省理工学院 开发的 RSA取名来自开发他们三者的名字 RSA是目前最有影响力的公钥加密算法 它能够抵抗到目前为止
  • 我的GIT练习TWO

    目录 前言 GIT安装教程 Git作者 GIT优点 GIT缺点 为什么要使用 Git GIT练习TWO C1 C2 C3 C4 C5 C6 C7 总结 前言 Git 是一个分布式版本控制及源代码管理工具 Git 可以为你的项目保存若干快照
  • vue3+element-plus上传文件,预览文件

    vue3 ts element plus上传文件 预览文件 场景 使用element plus的el upload标签 手动上传文件 可预览docx xlsx pdf jpg jpeg png 本地资源以及网络资源 1 使用el uploa
  • 三废的日常--Nginx实现负载均衡

    第二天 小废给大废买了杯奶茶 大废 这才差不多 讲了这么多早就应该给我奶茶了 吧唧吧唧 大废 那今天就来讲讲Nginx是如何实现负载均衡吧 二废 这个我知道 我看过Nginx的配置 nginx通过upstream下的配置 对配置的服务器进行
  • Go程序当父进程被kill,子进程也自动退出的问题记录

    平常我们启动一个后台进程 会通过nouhp 的方式启动 这样可以在退出终端会话的时候 进程仍然可以继续在后台执行 进程的父进程id会从原来的bash进程变成1 在go程序中 通过nouhp 的方式启动子进程 预期是即使父进程挂掉 子进程也能
  • 在阿里云CentOS7上搭建ftp服务器

    当我再次被各种出站入站规则玩弄 在搜索引擎的帮助走出泥淖后 我决定记下这次经历 1 FTP服务器的部署 1 1 安装vsftpd 笔者使用的是阿里云的ECS服务器 这不是广告 而是提醒 P 操作系统为CentOS7 首先 安装vsftp v
  • vue下基于elementui自定义表单-后端数据设计篇

    vue下基于elementui自定义表单 后端篇 自定义表单目前数据表单设计是基于数据量不大的信息单据场景 因为不考虑数据量带来的影响 数据表有 1 表单模版表 2 表单实例表 3 表单实例项明细表 4表单审批设计绑定表 以FormJson
  • 软件测试面试题11-接口自动化测试怎么做?

    面试过程中也遇到了这个问题 自己的回答 接口自动化测试 之前做过 第一个版本是用jmeter 做的 1 主要是将P0级别的功能接口梳理出来 根据业务流抓包获取相关接口 并在jmeter中跑通 2 是整理了项目上的所有接口 先将单个接口跑通
  • JDBC连接数据库的方法及注意事项

    Hello 小伙伴们 大家好 1 准备工作 先下载一个JDBC的驱动jar包 就在下面 直接拿去 https dev mysql com downloads connector j 放在新建的Directory文件夹里 一定要与src是同级
  • 重写QTabWidget,在标签后面添加图标按钮

    原本的QTabWidget没有支持在标签后面添加自定义的按钮的方法 想在后面添加自定义的功能按钮需要重写QTabWidget类 自己实现按钮图标的重绘和鼠标点击判断等操作 1 使用到的主要事件函数 1 void paintEvent QPa
  • 钢条切割-递归,记忆性递归,dp

    钢条切割 方法1 递归 import java util Scanner public class Cutting public static int n 10 public static int p 1 5 8 16 10 17 17 2
  • CBU计算机硕士申请难度,电脑开机后CBU百分只百是什么问题

    公告 为响应国家净网行动 部分内容已经删除 感谢读者理解 话题 电脑开机后CBU百分只百是什么问题回答 有几点建议供您参考 一 使用360 优化大师等工具 将系统启动项进行优化 尽量不要自启动不常用的进程 如果不会就选择 一键优化 二 使用
  • assert_param的应用

    在STM32的固件库 到处都可以见到assert param 的使用 一开始见到这玩意就被打蒙了 不晓得它存在的价值 各种查询 理解综合如下 如果打开任何一个例程中的stm32f10x conf h文件 就可以看到实际上assert par
  • 记一次部署发现r2dbc连接数据库问题

    1 背景 a 项目使用R2DBC连接数据库 b 项目在自己搭建环境部署 各种组件使用自己的镜像 没有问题 在客户现场部署 mysql等使用客户服务 发现启动成功后隔几分钟数据库连接被断开 访问数据库报连接超时 2 最终原因 客户数据库服务的
  • go 入门学习 go 语言变量声明方式

    什么是变量 在编程语言中 为了方便操作内存特定位置的数据 我们用一个特定的名字与位于特定位置的内存块绑定在一起 这个名字被称为变量 动静态语言的区别 静态语言有别于动态语言的一个重要特征 变量声明 比如PHP 动态 解释性语言 不必须设定变
  • Unity 透视镜效果 shader模板测试实现 shader学习杂记(一)

    1 透视镜效果示例 场景中创建了三个物体 一个方块 一堵墙 一个球体 然后创建三个材质球 三个初始的shader 将三个shader分别拖给三个材质球 再把材质球拖给三个物体 给这三个物体红色 蓝色 绿色 便于观察 看一下以红色方块为透视镜