<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zakerhero的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zakerhero</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zakerhero]]></copyright><item><title><![CDATA[深谈UE4粒子系统对象池的惊人大坑]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/126885870</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/126885870</guid><author>zakerhero</author><pubDate>Mon, 10 Oct 2022 22:48:48 +0800</pubDate><description><![CDATA[标题起得很唬人，但一点不唬人。
作者在这里告诫大家，不要使用Cascade的对象池，会有bug，并且不起作用！
建议大家都转成使用Niagara，Niagara的对象池功能齐全，并且没什么bug。]]></description><category></category></item><item><title><![CDATA[Unity Build-in管线shader移植到URP管线下]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/118933660</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/118933660</guid><author>zakerhero</author><pubDate>Tue, 20 Jul 2021 14:05:15 +0800</pubDate><description><![CDATA[概述

目前Build-in管线的shader都是代码形式的，不是shader graph。

所以如果想移植到URP管线下，或者HDRP管线下使用，必须修改代码。



具体步骤

在URP管线下，CGIncludes里的某些接口是失效的。

一、灯光模式



灯光模式是forward的接口，在URP下不是这么写的。

修改步骤如下；

LightMode里的值改成UniversalForward。如下：

"LightMode"="UniversalForward"

删掉以下内容：

#define]]></description><category></category></item><item><title><![CDATA[Unity URP管线下多光源渲染]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/115709676</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/115709676</guid><author>zakerhero</author><pubDate>Tue, 13 Jul 2021 15:05:26 +0800</pubDate><description><![CDATA[Unity URP管线下多光源渲染

抓手

urp管线下，获得其他多光源的方式和内置管线的不一样。

本文会阐述具体方法，并给出源码。



首先要在pipeline中打开Additional lighting的设置。



然后在shader中。


#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"


int addLightsCount = GetAdditionalLightsCount]]></description><category></category></item><item><title><![CDATA[Unity URP 获取深度图]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/115693888</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/115693888</guid><author>zakerhero</author><pubDate>Wed, 14 Apr 2021 20:25:36 +0800</pubDate><description><![CDATA[抓手

可能大家知道build-in管线的深度图如何获取了，但是URP管线下因为api不同了，所以需要移植一下。


]]></description><category></category></item><item><title><![CDATA[Unity Alpha Blend混合的最终解释]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/114142686</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/114142686</guid><author>zakerhero</author><pubDate>Fri, 26 Feb 2021 17:25:53 +0800</pubDate><description><![CDATA[抓手：

unity官方文档对于alphablend的解释不知是翻译还是什么问题，感觉略深奥呀，感觉不通俗。

今天来给自己和大家做一个关于alphablend的终极解释。



关于Alpha Blend的定义：

shader执行后，计算出来的像素颜色值与已有像素的颜色值的组合方式的 控制命令称为：alphablend！

也就是，alphablend是一种控制命令，是一种命令！

我自己对于Alpha Blend理解的定义：

alpha blend是一个计算公式，和Photoshop的图层...]]></description><category></category></item><item><title><![CDATA[Unity的URP的自定义后处理效果（三） 之 毛玻璃效果]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/108630810</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/108630810</guid><author>zakerhero</author><pubDate>Wed, 16 Sep 2020 21:25:52 +0800</pubDate><description><![CDATA[抓手

本文详说如何在URP管线下做毛玻璃效果。

有两种方法，方法一是用URP自带的OpaqueTexture,但是Opaque是不透明的意思，

所以它的缺陷是半透明的物体它是不会渲染到OpaqueTexture里去的。

方法二是用RendererFeature，本文主要讲第二种方法。

实现原理

先在一帧里用RendererFeature用某个camera截一帧的图。

然后用CommandBuffer做多次高斯模糊，达到这种毛玻璃效果。

最后渲染到一个RenderTexture上。

具体..]]></description><category></category></item><item><title><![CDATA[Unity的URP的自定义后处理效果（二）之 自定义扩展Volume]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/108171533</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/108171533</guid><author>zakerhero</author><pubDate>Mon, 24 Aug 2020 16:37:33 +0800</pubDate><description><![CDATA[抓手

之前写过一篇叫《Unity的URP的自定义后处理效果》的文章，传送门：

https://blog.youkuaiyun.com/zakerhero/article/details/106793571，但是并不完全是我想要的效果。

因为最终我是希望像Unity 自带的Volume一样去扩展自定义的后处理效果，可以随时关闭和打开。

最近查看了一些文章，终于知道该怎么做了。

本文结构：

原理

具体实现

参考文章

源码下载

具体实现：


...]]></description><category></category></item><item><title><![CDATA[Unity 3D模型做半透明剪影效果]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/107789728</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/107789728</guid><author>zakerhero</author><pubDate>Tue, 04 Aug 2020 19:37:11 +0800</pubDate><description><![CDATA[抓手

项目组需要一个类似如下的半透明剪影效果，不过我们是3D模型，那么就需要一些特殊的做法。

最终通过使用Stencil Buffer解决了。



详解

一、刚开始的的自以为是

刚做这个需求之前，以为很容易做，不就是在frag shader里return一个半透明的黑色颜色值吗？

然后Tags改成透明

Tags { "RenderType"="Transparent" "Queue" = "Transparent" }

混合模式为

Blend SrcAlpha OneMinusSr...]]></description><category></category></item><item><title><![CDATA[Unity SRP Batcher的工作原理]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/107714801</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/107714801</guid><author>zakerhero</author><pubDate>Fri, 31 Jul 2020 16:18:17 +0800</pubDate><description><![CDATA[抓手

根据我的理解总结，SRP Batcher就是

1、把调用draw call前，一大堆CPU的设置工作给一口气处理了，增加了效率。

2、把材质的属性数据直接永久放入到显卡的CBUFFER里，那只要数据不变，CPU就可以

不需要把这些数据重新做设置工作。节省了CPU调用，增加了效率。

3、用专用的代码将引擎的属性（比如objects transform）直接放入到GPU显存，这个专用的代码是不是更快更强呢，

官方是这样么说的，用的词语是quickly，就是快。

具体的解释

SRP Batc]]></description><category></category></item><item><title><![CDATA[Unity 性能优化 之 非常酷的SRP Batcher！]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/107690964</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/107690964</guid><author>zakerhero</author><pubDate>Thu, 30 Jul 2020 16:10:11 +0800</pubDate><description><![CDATA[概述

既然用到了URP管线，那么在做渲染优化的时候，就需要针对URP管线做相应的优化。

今天发现了除了动态batching和静态batching以外的一个非常酷炫的batching，那就是SRP Batching。

因为动态batching限制较多，包括模型顶点不能超过300个，shader的顶点属性不能超过900个（假如你的vertex shader用到了vertex position,normal，一个uv，那300个顶点*3 = 900，这样计算的），并且材质和贴图得必须一致，还不能用材质的co]]></description><category></category></item><item><title><![CDATA[Unity URP管线如何截屏，及热扰动（热扭曲）效果的实现]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/107635481</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/107635481</guid><author>zakerhero</author><pubDate>Tue, 28 Jul 2020 15:15:21 +0800</pubDate><description><![CDATA[概述

URP管线环境下，GrapPass是失效的。

那么，有什么替代方法呢。除了RenderTexture以外，今天发现了一个方法。

那就是URP自带的OpaqueTexture。

在ShaderGraph的节点就是SceneColor。



顾名思义，OpaqueTexture就是渲染完不透明物体后截屏的图，我没完全明白为什么Unity不把半透明的物体也截进去。

有可能是因为某些设备半透明物体必须在完全渲染完毕后才能输出到屏幕上，而截屏等不到那一个阶段，因为截屏的图片也用于

渲染物体呀，这就]]></description><category></category></item><item><title><![CDATA[Unity Shader如何判断某个属性（或某张贴图）没有赋值]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/107408091</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/107408091</guid><author>zakerhero</author><pubDate>Fri, 17 Jul 2020 15:27:40 +0800</pubDate><description><![CDATA[概述

因为有时候写shader的时候，如果某张贴图不赋值，其实完全可以不处理它们的。

我看unity内置的一些shader可以通过某个关键字或宏来判断。但是之前没研究他们的具体写法。

今天发现了可以用ShaderGUI来实现这个功能。

具体做法

先写一个ShaderGUI，比如说，我要判断某张贴图是否赋值了。


using System.Collections;
using UnityEngine;
using UnityEditor;
using System;

public class S]]></description><category></category></item><item><title><![CDATA[Unity Tilemap 添加相应的法线贴图、高光贴图等等（超便捷方法）]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/107321314</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/107321314</guid><author>zakerhero</author><pubDate>Mon, 13 Jul 2020 17:51:30 +0800</pubDate><description><![CDATA[概述

项目组需要不同的地块用不同的法线贴图和高光、粗糙贴图等等。

但是我们用的是集成到unity里的 tile map。它们的代码并非是开源的，重要的渲染方式的代码都写在C++里。

拓展性非常不友好。尝试过用MaterialPropertyBlock去修改，但是因为拿不到每种地块渲染前的代码，所以

根本不知道怎么去替换法线贴图。

终于在查找资料的时候，无意中找到了Unity官方自带的一种方法：

Sprite Editor: Secondary Textures ！！！！！

详细介绍

因为t.]]></description><category></category></item><item><title><![CDATA[如何把Unity surf shader翻译为vert frag shader（懒人方法）]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/106917838</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/106917838</guid><author>zakerhero</author><pubDate>Tue, 23 Jun 2020 10:50:39 +0800</pubDate><description><![CDATA[起因

因为Unity URP环境下，surf shader是会失效的。

所以必须把surf shader 翻译为vert frag方式的shader。

因为不太明白surf里的Lighting 函数是怎么生效的。查阅了一些资料，终于找到了一个懒人方法。

以下就是具体的操作：

一，选择要翻译的shader，点击Show generated code。



这时候就会在IDE中显示已经生成的vert frag shader，但是里面的代码有很多冗余，变体的东西。

二、我们只需把里面的surf函数、]]></description><category></category></item><item><title><![CDATA[Unity的URP的自定义后处理效果]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/106793571</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/106793571</guid><author>zakerhero</author><pubDate>Tue, 16 Jun 2020 20:11:14 +0800</pubDate><description><![CDATA[概述

本来想写这个很久了，但是一直都在忙别的。

最近项目也需要用到URP的后处理，但是不一定有想要的后处理效果。所以有些还是得自己写。

但是URP的后处理和之前unity的后处理写法完全不一样了。原来的OnRenderImage、OnPreRender都失效了。

本文只探讨如何写URP下的自定义后处理，并非讨论具体的渲染效果，这里我只做了修改对比度的屏幕特效。



具体实现

首先需要创建一个自定义的c#的ScriptableRendererFeature和ScriptableRenderPass]]></description><category></category></item><item><title><![CDATA[Unity只在一个面片上实现真实水体渲染]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/106769979</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/106769979</guid><author>zakerhero</author><pubDate>Tue, 16 Jun 2020 11:44:46 +0800</pubDate><description><![CDATA[概述

因为前一版卡通水体制作人觉得效果一般，所以换成了《海岛纪元》这种风格的水体。

这次我使用截帧工具，本来打算复刻一版的，后来发现他们貌似不是用unity做的。代码风格有点不一样。

其实是因为我看不懂他们的代码。。这次使用RenderDoc来截帧，效果还不错。

具体实现

通过截帧工具可以看到：

生成浪花的贴图是由lightmap和一个Rays贴图来渲染的。



而且浪花是单独一个mesh，这波操作其实我是看不懂的。原本以为通过shader在一个面片上就可以实现类似效果。



他们浪花的渲染]]></description><category></category></item><item><title><![CDATA[Unity只在一个面片上实现卡通水效果]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/106645289</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/106645289</guid><author>zakerhero</author><pubDate>Tue, 09 Jun 2020 20:17:11 +0800</pubDate><description><![CDATA[概述

因为项目要做广大世界那种水效果。想过用类似九宫格之类的来实现。但是CPU压力比较大。

也试过用通过世界坐标采样河流数据贴图的方式，来不断刷新跟随摄像机的一个面片。

理论上是可以的，但实际上，会有抖动的效果，初步分析的原因是世界坐标移动的位置要刚好等于偏移整数个采样的像素的距离才

不会抖动。但是具体怎么改真是头疼。

所以想采用一个最简单，也是有点蠢的方式，就是只使用一个面片。笼罩在整个世界地图上，并通过采样河流数据贴图

的数据把整个水体渲染出来。这样一来只用到GPU渲染，CPU压力几乎忽略不]]></description><category></category></item><item><title><![CDATA[如何在unity的URP下实现阴影]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/106274331</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/106274331</guid><author>zakerhero</author><pubDate>Fri, 22 May 2020 10:45:23 +0800</pubDate><description><![CDATA[如果你之前是用buildin pipeline写的shader，其中用了SHADOW_ATTENUATION宏的话，在URP下会失效。

由于官方文档对自定义shader描述不多，所以自己只能去看URP内建的shader源码去看实现方法。

但是URP内建的shader都是用HLSLPROGRAM和ENDHLSL来写的，并且引用文件都是.hlsl。

和之前的CGPROGRAM，还有引用文件类型.cginc有所不同。

所以，如果想引用URP内建的方法和接口，必须得按照它们现在的方式来写。

但经师傅指点，]]></description><category></category></item><item><title><![CDATA[如何在Unity的URP下使用多pass（multi pass）]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/106264067</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/106264067</guid><author>zakerhero</author><pubDate>Thu, 21 May 2020 17:55:33 +0800</pubDate><description><![CDATA[Unity的工程如果从内置pipeline工程升级到URP的，多pass的shader，可能第二个pass后都会失效。

如果查看URP的源代码DrawObjectsPass.cs会发现


using System.Collections.Generic;

namespace UnityEngine.Rendering.Universal.Internal
{
    /// &lt;summary&gt;
    /// Draw  objects into the given color and d]]></description><category></category></item><item><title><![CDATA[Unity的URP项目开启]]></title><link>https://blog.youkuaiyun.com/zakerhero/article/details/106160451</link><guid>https://blog.youkuaiyun.com/zakerhero/article/details/106160451</guid><author>zakerhero</author><pubDate>Sat, 16 May 2020 16:12:18 +0800</pubDate><description><![CDATA[Unity在2019.3后的版本开始把SRP更名为URP。

此文章仅讲述如何开启URP项目。

开启URP项目有两种方法，一在创建项目中可以直接创建URP项目模板。

该模板带有一个例子。可以直观看到URP项目和一般项目的变化。



除了上述URP项目的创建方法外，还有一种将现在的项目升级为URP项目的方法。

就是在package manager里，安装URP的包，如下图：



但值得注意的是，如果将你当前的项目升级为URP后，当前的standard的shader将会失效。

因为URP的渲染和st]]></description><category></category></item></channel></rss>