unity, 替换shader渲染(Rendering with Replaced Shaders)

Unity材质替代渲染相关:RenderWithShader & SetReplacementShader Unity材质替代渲染相关:RenderWithShader & SetReplacementShader概要RenderWithShaderSetReplacementShader关于UsedShader和ReplaceTag的解释 概要 Unity提供了使用Camera实现场景中物体替换shader渲染的方法,来满足一些特殊需求。 public void RenderWithShade... 阅读详情

实现特效,尤其是一些后处理特效,经常需要将各物体的shader替换为另一套shader进行渲染到纹理,再后再进行合成或以某种叠加方式叠加到最后的画面上去。

再复杂一点儿的,可能不同的物体所用的替换shader还不一样。

unity中Camera.RenderWithShader可实现这个功能。

下面是官方文档原话:

Rendering with Replaced Shaders

Some rendering effects require rendering a scene with a different set of shaders. For example, good edge detection would need a texture with scene normals, so it could detect edges where surface orientations differ. Other effects might need a texture with scene depth, and so on. To achieve this, it is possible to render the scene with replaced shaders of all objects.

Shader replacement is done from scripting using Camera.RenderWithShader or Camera.SetReplacementShader functions. Both functions take a shader and a replacementTag.

It works like this: the camera renders the scene as it normally would. the objects still use their materials, but the actual shader that ends up being used is changed:

  • If replacementTag is empty, then all objects in the scene are rendered with the given replacement shader.
  • If replacementTag is not empty, then for each object that would be rendered:
    • The real object’s shader is queried for the tag value.
    • If it does not have that tag, object is not rendered.
    • A subshader is found in the replacement shader that has a given tag with the found value. If no such subshader is found, object is not rendered.
    • Now that subshader is used to render the object.

So if all shaders would have, for example, a “RenderType” tag with values like “Opaque”, “Transparent”, “Background”, “Overlay”, you could write a replacement shader that only renders solid objects by using one subshader with RenderType=Solid tag. The other tag types would not be found in the replacement shader, so the objects would be not rendered. Or you could write several subshaders for different “RenderType” tag values. Incidentally, all built-in Unity shaders have a “RenderType” tag set.

 

其中最需要理解的是replacementTag,上面文档详细叙述了replacementTag的逻辑,为了好理解,下面换种说法重新解释一遍:

*假设脚本中调用 GetComponent<Camera>().RenderWithShader(Shader.Find("shaderX"), ""),则此摄像机本次渲染的所有物体都会使用shaderX进行渲染。

*假设脚中中调用 GetComponent<Camera>().RenderWithShader(Shader.Find("shaderX"), "myReplacementTag"),则对于本次要渲染的每个物体object(i),假设object(i)本身的shader是shader(i),如果shader(i)的所有subShader都不带"myReplacementTag"标签,则object(i)不渲染;如果shader(i)中的subShader(j)带有"myReplacementTag"标签,设此标签为"myReplacementTag"="A",则unity会去shaderX中找"myReplacementTag"="A"的subShader,如果找到了,则用shaderX的此subShader替换object(i)的原有shader;否则object(i)不渲染。

需要指出的是,"myReplacementTag"应该总是用"RenderType",原因是unity内置的所有shader都带有RenderType标签。

举两个例子:

例1,将所有的不透明物体shader替换为另一种shader进行渲染:

写一个shaderX,让其中包含一个带"RenderType"="Opaque"标签的subShader,

调用GetComponent<Camera>().RenderWithShader(Shader.Find("shaderX"), "RenderType");

例2,将所有不透明物体shader替换为一种subShader进行渲染,同时将所有透明物体shader替换为另一种shader进行渲染:

写一个shaderX,让其中包含一个带“RenderType”="Opaque"标签的subShader,再写一个带"RenderType"="Transparent"标签的subShader,

调用GetComponent<Camera>().RenderWithShader(Shader.Find("shaderX"), "RenderType");

例3,将所有“RenderType”=“myRenderType”的物体的shader替换为另一种shader进行渲染:

写一个shaderX,让其中包含一个带"RenderType"="myRenderType"标签的subShader,

调用GetComponent<Camera>().RenderWithShader(Shader.Find("shaderX"), "RenderType");

 

另外,关于Camera.RenderWithShader与Camera.SetReplacementShader的区别:

Camera.RenderWithShader只是本次渲染使用替换的shader;Camera.SetReplacementShader是自调用起以后都使用替换的shader进行渲染,直到手动调用Camera.ResetReplacementShader为止,恢复为用本身的shader进行渲染。参考;http://m.blog.youkuaiyun.com/blog/QUAN2008HAPPY/39380463

 

另外在Camera.RenderWithShader的官方文档中写道:

This is used for special effects, e.g. rendering screenspace normal buffer of the whole scene, heat vision and so on. To make use of this feature, usually you create a camera and disable it. Then call RenderWithShader on it.

也就是说,在使用RenderWithShader实现特效时通常应该将调用RenderWithShader这个函数的相机设为disable,即:GetComponent<Camera>().enabled = false,或者也可以直接在Inspector中将Camera组件前的对勾去掉,是一样的效果。

原文地址:http://www.cnblogs.com/wantnon/p/4528677.html

理解 Unity3D RenderWithShader Api 主要参考: unity, 替换shader渲染(Rendering with Replaced Shaders) : http://www.cnblogs.com/wantnon/p/4528677.html 测试例子: Test.cs挂到Camera上 using UnityEngine; using System.Collections; public class Test 阅读详情

相关推荐

WRF气象建模实战:如何为JRA55非标准数据定制Vtable文件?

本文详细介绍了为WRF气象模型定制Vtable文件以支持JRA55非标准数据(特别是积雪数据)的完整实战流程。文章深入解析了WPS数据流中Vtable的核心映射逻辑,提供了从GRIB文件诊断、Vtable编写到METGRID.TBL调优的通用方法论,帮助用户解决非标准气象数据源适配的关键技术挑战。

c8d9e0f1的博客 673

Unity - RenderWithShader, SetReplacementShader, ResetReplacementShader 测试

Unity - RenderWithShader, SetReplacementShader, ResetReplacementShader 测试 最不喜欢介绍API,但可以参考该API的设计思路,想想,如果你自己先的引擎中,需要这些功能时,方可参考设计,当然如果不写引擎,就当作是磨砺一下使用的Unity这个工具。 API 简介 这三个API都是在Camera类下的 RenderWithShad...

Jave.Lin 的学习笔记 1462

一个Android应用层开发如何转型深入Android Framework?

不知何时起,单纯的Android应用层开发越来越少了,主流技术演变也越来越快,从之前的rxjava到如今的协程,从之前MVC到如今的MVVM,还有Flutter、Compose等技术,可以说是日新月异。

m0_64420071的博客 1910

Unity使用替换shader渲染(Rendering with Replaced Shaders)

作用: 在渲染时,通过SetReplacementShader控制实时生效的shader,可以在运行时修改部分or全部object的shader来实现特定的效果。 函数说明: Camera.SetReplacementShader public void SetReplacementShader(Shader shader, string replacementTag); Descrip...

coffeecato的个人博客 4397

STM32驱动AD7779:双极性电源下8通道同步ADC的SPI配置与数据采集实战

本文详细介绍了在双极性电源供电下,使用STM32通过SPI接口驱动AD7779同步ADC芯片实现8通道高精度数据采集的实战经验。重点解析了电源设计、抗干扰处理、寄存器配置、SPI通信技巧及数据校准方法,帮助工程师解决工业测量中的同步采样与噪声控制难题。

e3f4g5的博客 369

高速SerDes均衡技术解析

均衡技术是高速SerDes链路中补偿信道损耗和失真的核心技术,通过FFE、CTLE和DFE三种主要方法对抗码间干扰(ISI)。FFE在发射端预补偿前光标干扰,CTLE通过提升高频增益补偿信道损耗,DFE则精准消除后光标干扰。三种技术各具优势:FFE实现简单且不放大噪声,CTLE功耗低易于集成,DFE能自适应调整且保持信噪比。这些技术协同工作可有效提升系统传输速率和可靠性。

一只豌豆象的博客 1947

unity 替换渲染 ( Rendering with Replaced Shaders )

官方文档:file:///C:/Program%20Files/Unity/Editor/Data/Documentation/en/Manual/SL-ShaderReplacement.html圣典文档:http://www.ceeger.com/Components/SL-ShaderReplacement.html 功能: 先说说它能干什么。 有时候实现一些特效,尤其

勥小透明 4208

信捷XD/XL系列PLC与C#通信实战:Modbus-RTU协议详解(附完整代码)

本文详细介绍了信捷XD/XL系列PLC与C#通过Modbus-RTU协议实现高效通信的实战指南。从硬件连接到软件配置,再到核心通信功能的实现与优化,提供了完整的代码示例和工业级应用建议,帮助开发者快速构建稳定的自动化通信系统。

weixin_28292761的博客 511

Unity3D翻译——Rendering with Replaced Shaders

Rendering with Replaced Shaders      使用替换着色器来渲染 原文地址:http://unity3d.com/support/documentation/Components/SL-ShaderReplacement.html 如有翻译不当之处,还请帮忙指出!   Some rendering effects require rendering a

游戏点滴 3216

YOLO小目标检测优化:9种实用方案,准确率直接提升15%

小目标检测是个系统工程,没有银弹,但有明确的优化路径。优先搞数据。Copy-Paste + 提升分辨率,这俩加起来成本最低、收益最大,能解决80%的小目标问题。别一上来就改模型结构。调参走在改结构前面。锚框聚类、损失加权、增强优化,这些都是零成本的,先做满了再说改模型的事。P2层是大杀器,但不要轻易用。加了P2层,TensorRT部署、后处理、速度都要跟着调,工程化工作量翻倍。数据和训练做到位还不够,再加也不迟。滑动窗口是兜底的。能从训练端解决的问题,就不要拖到推理端。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 186

【Android逆向工程】第17章:反调试与反 Hook 对抗技术

本文介绍了Android应用常见的反调试技术及其对抗策略。主要内容包括: 反调试技术概述 分类:进程检测(ptrace、TracerPid)、文件检测、行为检测(时间/断点)、内存检测、框架检测 对抗思路:识别检测点→Hook检测函数→修改返回值→隐藏工具特征 ptrace检测实现 原理:利用ptrace系统调用检测调试器附加 实现方式:直接检测、持续线程检测、fork子进程检测 绕过方法:Frida Hook ptrace函数返回0,或使用LD_PRELOAD注入假函数 综合防护 涉及多种检测技术的组合使

w987333120的博客 359

Unity URP粒子特效利器:NovaShader核心功能与性能优化全解析

在Unity游戏开发中,着色器(Shader)是实现高质量视觉特效的核心技术之一,它通过编写GPU程序来控制物体表面的渲染方式。其原理在于将顶点数据、纹理信息与光照模型结合,通过一系列数学运算生成最终像素颜色。对于粒子系统(VFX)而言,着色器的技术价值尤为突出,它直接决定了火焰、烟雾、魔法轨迹等动态效果的视觉表现力与运行效率。在URP渲染管线中,开发者常面临为不同特效编写和维护多个独立着色器的挑战,这不仅影响开发效率,也为性能优化和跨平台兼容带来隐患。NovaShader作为一个专为URP设计的超级着色器

weixin_34138056的博客 345

SAP ABAP CO核心扩展-为企业定制ZCKM3N物料价格分析增强(CKM3 CKM3N CKM8N)

这篇文章,将为大家讲述物料价格分析扩展增强(ZCKM3N)的方法和原理,并基于CKM3N的视图之一“CV成本组件”,教大家如何一步步实现批量输出多工厂物料的物料价格分析报表。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 3982

Unity3D中Camera类的RenderWithShader方法和SetReplacementShader方法使用解析

2.2.2 RenderWithShader方法:使用其他shader渲染 基本语法:public void RenderWithShader(Shader shader, string replacementTag); 其中参数shader为要使用的shader;replacementTag 为shader的Tag标示。 功能说明:此方法的作用是可以使用指定的shader来代替当前物体的s

宏哥的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

unity camera RenderWithShader ,SetReplacementShader

2.2.2 RenderWithShader方法:使用其他shader渲染 基本语法:public void RenderWithShader(Shader shader, string replacementTag); 其中参数shader为要使用的shader;replacementTag 为shader的Tag标示。 功能说明:此方法的作用是可以使用指定的shader来代替当前物体...

N的专栏 570

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Shader进阶】SubShader块标签Tags——RenderType

目录 目的:理解RenderType的作用 ,当初学习《Shader入门精要》时写有如下总结 使用替换的着色器渲染(官方解释) 一、 Camera.SetReplacementShader实战 二、Camera.SetReplacementShader总结 三、Camera.RenderWithShader实战 四、Camera.RenderWithShader总结 目的:理解Ren...

两水先木示的博客 2418

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

unity Camera.SetReplacementShader()切换后物体变黑的问题

可能的原因之一 Camera.SetReplacementShader()函数在替换shader的时候,仅替换Subshader部分。这个时候,如果Subshader中有一些参数,没有在Properties里面给到的话,就会出现变黑这种情况。(就算是新shader文件中的Properties有这些参数也不行,需要物体的这个shader中的参数也有这些。) 当然,如果你不确定你的错误是不是这个导致的,那么请往下看: 问题描述 一开始,物体是这样的: 在使用mainCam.SetReplacementShad

Bi9R!ver的博客 1031

unity shader之基础 一二三:渲染简介

一:渲染流水线: 应用阶段:主要在CPU执行,准备好需要渲染的数据,输出渲染图元 几何阶段:在GPU执行,主要处理顶点的坐标空间转换,把这些处理过的数据传递给下一阶段 光栅化阶段:在GPU执行,对上一阶段产生的数据,进行着色,最终输出到屏幕上 由于顶点数量要远小于片元数量的,所以一个片元的颜色、深度等,是对顶点进行线性插值得到的 裁剪:把不在摄像机视野内的顶点裁剪掉 三角形设置:根据顶点数据,生成三角形数据 三角形遍历:根据像素和三角形的覆盖情况,获取片元 片元着色器:进行着色 逐片元

qq_37672438的博客 1214

替换着色器Replacement Shader的用法

方法解释 1.Tags可以自定义。 2.subshader标签的使用: 原本的shader: Tags { “RenderType”=“Opaque” } 替换的shader: Tags { “RenderType”=“Opaque” } Tags { “RenderType”=“SomethingElse” } 标签为"RenderType"=“Opaque"的,会被同样是"RenderType”="Opaque"标签的替换shader所替换。 需要替换的shader,RenderType后面的键值要一样

weixin_42362584的博客 1393
上一篇: CG标准函数库
下一篇: 法线的归一化和法线视图变换矩阵的正确设置
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值