<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[长生但酒狂的博客]]></title><description><![CDATA[热爱游戏开发，热爱shader]]></description><link>https://blog.youkuaiyun.com/qq_28299311</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_28299311]]></copyright><item><title><![CDATA[Unity Shader - PBR相关公式及代码]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/123312767</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/123312767</guid><author>qq_28299311</author><pubDate>Sun, 06 Mar 2022 16:47:58 +0800</pubDate><description><![CDATA[简单记录一下PBR相关的公式及实现代码，方便后面自己复制粘贴 -。
当然这些公式都是在各个文章和引擎源码复制粘贴而来的，仅供参考。ヾ(•ω•`。)
PBR
PBR 由直接光照和间接光照组成。
判断一种PBR光照模型是否是基于物理的，必须满足以下三个条件：

基于微平面(Microfacet)的表面模型。
能量守恒。
应用基于物理的BRDF。

渲染方程(The Rendering Equation)：
L0=Le+∫Ωfr⋅Li⋅(wi⋅n)⋅dwiL _ { 0 } = L _ { e } + \int ]]></description><category></category></item><item><title><![CDATA[Unity Shader - 水体交互]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/122026679</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/122026679</guid><author>qq_28299311</author><pubDate>Sun, 19 Dec 2021 17:29:53 +0800</pubDate><description><![CDATA[水体交互效果在游戏中是一个很常见的需求，这里简单实现一个可交互的水体。
本篇文章主要是介绍水体交互的实现思路，水体的渲染这里就不再详细介绍，网上很多关于水体的渲染方法很多，可以自己百度、Google了解一下，这里不会过多提及。
效果图。
先放一张最终的GIF效果图！

实现思路
原理其实非常简单，就是通过粒子系统不断发射带有波纹法线贴图的面片，然后把这些法线渲染一张RenderTexture传输到Water Shader中，然后和Water Normal 叠加即可形成水波效果。
实现步骤可以简单分为：

简]]></description><category></category></item><item><title><![CDATA[Unity Shader - 屏幕空间次表面散射]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/120576465</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/120576465</guid><author>qq_28299311</author><pubDate>Fri, 01 Oct 2021 11:31:29 +0800</pubDate><description><![CDATA[屏幕空间次表面散射
前言
在上篇文章中我们简单实现了一个伪次表面散射模拟效果，这次我们就基于屏幕空间模糊的方式来模拟皮肤的次表面渲染。
实现
大致流程：

提取次表面散射对象Mask遮罩。
高斯模糊处理 + Mask遮罩。
最后和原图叠加。


1.提取皮肤遮罩
这里为了简单方便，直接采用Command Buffer提取需要次表面散射的对象Mask遮罩。
注意这里用了一个纯色Shader处理
C# 代码：
// 纯色Shader
Shader purecolorShader = Shader.Find("l]]></description><category></category></item><item><title><![CDATA[Unity Shader - 伪次表面散射模拟]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/120240531</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/120240531</guid><author>qq_28299311</author><pubDate>Sat, 11 Sep 2021 17:35:18 +0800</pubDate><description><![CDATA[前言
感觉好久没更新博客了，这段时间决定重新把写博客的习惯捡起来！前段时间学习研究了一下次表面散射相关的知识，这次我们就在Unity中简单实现一下该效果。如果哪里有错误的地方，希望大家能够指出，多多讨论。
次表面散射（Subsurface scattering）
次表面散射是光在传播时的一种现象，表现为光在穿过透明物体表面后，与材料之间发生交互作用而导致光被散射开来，光路也在其他的位置穿出物体。光一般会穿透物体的表面，在物体内部在不同的角度被反射若干次，最终穿出物体。次表面散射在三维计算机图形中十分重要，.]]></description><category></category></item><item><title><![CDATA[Unity Shader - Shader常用属性标签（材质属性面板标签）]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/119673282</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/119673282</guid><author>qq_28299311</author><pubDate>Fri, 13 Aug 2021 13:10:28 +0800</pubDate><description><![CDATA[记录分享一下一些Shader常用的属性标签（材质属性面板标签）
如图：

代码：
Shader "lcl/ShaderPropertyDrawer/ShaderEnum"
{
    // 材质属性面常见类型
    Properties
    {
        [Header(Custom)]
        // 自定义枚举
        [Enum(CustomEnum1,1,CustomEnum2,2)]  _CustomEnum ("CustomEnum", Float) = 1

    ]]></description><category></category></item><item><title><![CDATA[CocosCreator - Bezier曲线插件]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/117024575</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/117024575</guid><author>qq_28299311</author><pubDate>Wed, 19 May 2021 12:54:47 +0800</pubDate><description><![CDATA[自己用业余时间写的第一款CocosCreator小插件。
Bezier插件链接
Bezier曲线插件说明
Bezier曲线是一款方便开发者做路径规划以及曲线运动的插件，支持可视化编辑、匀速曲线运动、支持各种缓动（InSine、OutSine等等）、支持多段曲线运动、绘制路径。方便开发者在项目组快速的实现曲线运动，不再为贝塞尔曲线不能匀速而烦恼。
注意：该插件仅支持Creator 2.2.0 - 2.4.4 版本，其他版本的需要手动拷贝 Packages/bezier/Bezier 文件夹到项目中，并且需要微]]></description><category></category></item><item><title><![CDATA[Unity 内置渲染管线转URP]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/116999100</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/116999100</guid><author>qq_28299311</author><pubDate>Tue, 18 May 2021 19:32:06 +0800</pubDate><description><![CDATA[一、CG 替换 HLSL


未使用光照计算的shader升级后不做修改仍然可以使用，但是可能会不兼容SRP Batcher，所以仍然需要修改，使用了光照计算的shader必须要修改。


SubShader的Tags中增加 “RenderPipeline”="UniversalPipeline"声明


要保证多pass物体正确绘制，需要确保有个pass打上 UniversalForward 的tag，其余pass有 SRPDefaultUnlit的tag也行，没有也行。



HLSLPROGRAM 替]]></description><category></category></item><item><title><![CDATA[Unity Editor - 在编辑器模式下执行exe程序、打开文件、定位脚本行]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/111375789</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/111375789</guid><author>qq_28299311</author><pubDate>Fri, 18 Dec 2020 16:08:19 +0800</pubDate><description><![CDATA[执行exe程序、打开文件
当我们想在Unity 编辑器下 通过exe程序打开指定脚本时我们可以调用以下API
这里我是通过vscode 打开 lua 脚本 并定位到具体某一行。
static void OpenFile(string path, int line)
{
    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startI]]></description><category></category></item><item><title><![CDATA[Unity Editor - 打开场景并获取场景下的所有物体]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/111375082</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/111375082</guid><author>qq_28299311</author><pubDate>Fri, 18 Dec 2020 15:59:53 +0800</pubDate><description><![CDATA[打开场景
 UnityEditor.SceneManagement.EditorSceneManager.OpenScene("Assets/ArtTools/ModelShow/Scenes/ModelShowTest.unity");

获取场景下所有物体
UnityEngine.SceneManagement.Scene curScene = UnityEditor.SceneManagement.EditorSceneManager.GetSceneByPath("Assets/ArtTools/M]]></description><category></category></item><item><title><![CDATA[Lua - Table扩展方法]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/111159194</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/111159194</guid><author>qq_28299311</author><pubDate>Mon, 14 Dec 2020 16:03:14 +0800</pubDate><description><![CDATA[是否包含某元素
--table 是否包含某个元素
function table.contains(table, element)
    if table == nil then
        return false
    end

    for _, value in pairs(table) do
        if value == element then
            return true
        end
    end
    return false
end

t]]></description><category></category></item><item><title><![CDATA[Lua - 精确小数位数（四舍五入、去掉末尾0）]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/110953570</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/110953570</guid><author>qq_28299311</author><pubDate>Thu, 10 Dec 2020 15:12:55 +0800</pubDate><description><![CDATA[四舍五入
function math.getPreciseDecimalRound(nNum, n)
	n = n or 0;
	n = math.floor(n)
	if n &lt; 0 then
        n = 0;
    end
	local format = "%." .. n .. "f"
	return string.format(format, nNum)
end

精确小数位数（去末尾0）
function math.getPreciseDecimalFloor(nNum, n)]]></description><category></category></item><item><title><![CDATA[Lua - 时间戳转换以及常用方法]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/110947152</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/110947152</guid><author>qq_28299311</author><pubDate>Thu, 10 Dec 2020 10:17:32 +0800</pubDate><description><![CDATA[时间戳转日期
os.date("%Y-%m-%d %H:%M:%S",timestamp)
--os.date("%Y-%m-%d %H:%M:%S",1607428399) 2020-12-08 19:53:19

日期转时间戳
os.time({year = 2020, month = 12, day = 8, hour = 0, minute = 0, second = 0})
--1607356800

转成年月日Table
function FormatUnixTime2Date(unixTime]]></description><category></category></item><item><title><![CDATA[Cocos Creator - 2D扭曲Shader]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/108129534</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/108129534</guid><author>qq_28299311</author><pubDate>Thu, 20 Aug 2020 18:54:58 +0800</pubDate><description><![CDATA[前言
昨天刚办完离职手续，今天闲来无事，就分享一篇关于cocos shader中的扭曲（水波纹）特效的实现吧，话不多说，直接步入正题。
效果

这个效果原理非常简单，就是对 texture 随机采样，当然，这个随机会有一定的约束，不能太随机，在当前uv坐标附近随机即可。也就是说对uv进行随机偏移。
在shader中没有内置的随机函数，要么自己写一个随机函数，要么通过采样噪声图拿到随机值。这里我们就采用第二种方法，简单而且性能也好。(在shader中严格说来应该叫噪声，有兴趣的可以自己去查阅相关的资料)
首先]]></description><category></category></item><item><title><![CDATA[Laya Air - 如何在Laya3D中实现屏幕后期特效?]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/106488780</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/106488780</guid><author>qq_28299311</author><pubDate>Thu, 09 Jul 2020 20:23:33 +0800</pubDate><description><![CDATA[前言
最近由于项目的原因，不得不去学习了一下Laya这款游戏引擎，在学习使用过程中，我发现

]]></description><category></category></item><item><title><![CDATA[Vscode 格式化GLSL代码时提示: write EPIPE 解决方案!]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/106267704</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/106267704</guid><author>qq_28299311</author><pubDate>Thu, 21 May 2020 21:18:40 +0800</pubDate><description><![CDATA[前言
最近在开始用Vscode编写GLSL，既然要编写Shader代码那肯定需要安装相应的代码高亮提示等相关插件了，在安装好 “Shader languages support for VS Code” 和 “Clang-Format” 插件后， 代码高亮是可以了！
但是 格式化代码的时候总是提示：write EPIPE
我在网上也找了好多解决方案，无一例外都是说 在vscode setting.json文件中加入以下代码
 "clang-format.executable": "C:/Users/Admi]]></description><category></category></item><item><title><![CDATA[Unity Shader - Bloom(光晕、泛光)]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/106113698</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/106113698</guid><author>qq_28299311</author><pubDate>Thu, 14 May 2020 10:02:10 +0800</pubDate><description><![CDATA[前言
Bloom（光晕）是一种计算机图形效果，用于视频游戏，演示和高动态范围渲染（HDRR）中，以再现真实相机的成像伪像。该效果会产生从图像中明亮区域的边界延伸的条纹（或羽毛），从而造成超亮的光使摄像机或眼睛捕捉场景的幻觉。
效果对比如下:
左边是原图, 右边Bloom处理后的

原理:
Bloom的实现原理非常简单，大致分为三步:

对需要处理的图像经过亮度提取, 并且通过一个阙值来控制亮度
对经过亮度提取后的图像进行模糊处理(这里是采用高斯模糊)
最后再叠加原图和模糊处理后的图像,输出即可

实现
下面]]></description><category></category></item><item><title><![CDATA[Unity Editor - 一键导出模型内置材质、设置模型设置、修改Shader]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/105943627</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/105943627</guid><author>qq_28299311</author><pubDate>Wed, 06 May 2020 09:55:19 +0800</pubDate><description><![CDATA[前言
在用Unity游戏开发的时候，可能有时候我们需要修改模型的缩放比例（Scale Factor）或者从FBX导出材质球，或者需要修改Shader 等等操作时，如果模型少，我们可以一个一个的修改，但是如果大量的模型都需要修改的话，那我们一个一个的单独去修改就非常的耗时耗力。
所以，为了偷懒，我就去简单学习了下Unity Editor的编写。
然后就简单的编写了一个Unity 编辑器扩展，支持一键...]]></description><category></category></item><item><title><![CDATA[Unity2019.3.5 VsCode中 找不到UnityEngine.UI命名空间]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/105738368</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/105738368</guid><author>qq_28299311</author><pubDate>Fri, 24 Apr 2020 19:30:32 +0800</pubDate><description><![CDATA[Unity2019.3.5 VsCode中 找不到UnityEngine.UI命名空间
命名空间“UnityEngine”中不存在类型或命名空间名“UI”(是否缺少程序集引用?)
由于在Unity2019.3.5 UI模块的dll文件移到其他位置了,vscode还是找的以前的路径所以会导致引用不正确
解决方案:
把Unity 中的默认编辑器改为VS，然后用VS打开工程即可。此时就修改了 Assem...]]></description><category></category></item><item><title><![CDATA[Window 上安装任意版本的.NETFramework问题 (Unity Vscode代码无提示)]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/105674102</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/105674102</guid><author>qq_28299311</author><pubDate>Wed, 22 Apr 2020 09:38:17 +0800</pubDate><description><![CDATA[前言
首先为什么需要安装任意版本的.NETFramework呢？因为在开发中我们可能会遇到需要不同版本的.NETFramework，可以是需要和同事保持版本一致，或者因为不同的项目需求，或者因为Unity Vscode代码不提示（需要选择正确的.NETFramework版本）等原因。
但是当我们windows上安装高版本的时候，此时你想安装低版本的，系统会提示你 “这台计算机中已经安装了 T Fr...]]></description><category></category></item><item><title><![CDATA[设计模式 - 状态模式与策略模式的区别]]></title><link>https://blog.youkuaiyun.com/qq_28299311/article/details/105564531</link><guid>https://blog.youkuaiyun.com/qq_28299311/article/details/105564531</guid><author>qq_28299311</author><pubDate>Thu, 16 Apr 2020 18:44:26 +0800</pubDate><description><![CDATA[类图：
状态模式和策略模式的类图几乎一模一样。


策略模式：
其思想是针对一组算法，将每一种算法都封装到具有共同接口的独立的类中，不同的行为使用不同的算法，并且它们可以相互替换。它是直接依赖注入到Context类的参数进行选择策略，所以客户端必须事先知道策略,由它去指定环境(Context)类使用哪种策略(算法)。
状态模式：
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的...]]></description><category></category></item></channel></rss>