shader
文章平均质量分 85
黄琅
曾是Unity3d客户端,现转职为TA
展开
-
Unity Build-in管线shader移植到URP管线下
概述目前Build-in管线的shader都是代码形式的,不是shader graph。所以如果想移植到URP管线下,或者HDRP管线下使用,必须修改代码。具体步骤在URP管线下,CGIncludes里的某些接口是失效的。一、灯光模式灯光模式是forward的接口,在URP下不是这么写的。修改步骤如下;LightMode里的值改成UniversalForward。如下:"LightMode"="UniversalForward"删掉以下内容:#define原创 2021-07-20 14:05:15 · 5162 阅读 · 7 评论 -
Unity Alpha Blend混合的最终解释
抓手:unity官方文档对于alphablend的解释不知是翻译还是什么问题,感觉略深奥呀,感觉不通俗。今天来给自己和大家做一个关于alphablend的终极解释。关于Alpha Blend的定义:shader执行后,计算出来的像素颜色值与已有像素的颜色值的组合方式的 控制命令称为:alphablend!也就是,alphablend是一种控制命令,是一种命令!我自己对于Alpha Blend理解的定义:alpha blend是一个计算公式,和Photoshop的图层...原创 2021-02-26 17:25:53 · 2436 阅读 · 0 评论 -
Unity的URP项目开启
Unity在2019.3后的版本开始把SRP更名为URP。此文章仅讲述如何开启URP项目。开启URP项目有两种方法,一在创建项目中可以直接创建URP项目模板。该模板带有一个例子。可以直观看到URP项目和一般项目的变化。除了上述URP项目的创建方法外,还有一种将现在的项目升级为URP项目的方法。就是在package manager里,安装URP的包,如下图:但值得注意的是,如果将你当前的项目升级为URP后,当前的standard的shader将会失效。因为URP的渲染和st原创 2020-05-16 16:12:18 · 19807 阅读 · 1 评论 -
如何在unity的URP下实现阴影
如果你之前是用buildin pipeline写的shader,其中用了SHADOW_ATTENUATION宏的话,在URP下会失效。由于官方文档对自定义shader描述不多,所以自己只能去看URP内建的shader源码去看实现方法。但是URP内建的shader都是用HLSLPROGRAM和ENDHLSL来写的,并且引用文件都是.hlsl。和之前的CGPROGRAM,还有引用文件类型.cginc有所不同。所以,如果想引用URP内建的方法和接口,必须得按照它们现在的方式来写。但经师傅指点,原创 2020-05-22 10:45:23 · 15856 阅读 · 14 评论 -
Unity的URP的自定义后处理效果(三) 之 毛玻璃效果
抓手本文详说如何在URP管线下做毛玻璃效果。有两种方法,方法一是用URP自带的OpaqueTexture,但是Opaque是不透明的意思,所以它的缺陷是半透明的物体它是不会渲染到OpaqueTexture里去的。方法二是用RendererFeature,本文主要讲第二种方法。实现原理先在一帧里用RendererFeature用某个camera截一帧的图。然后用CommandBuffer做多次高斯模糊,达到这种毛玻璃效果。最后渲染到一个RenderTexture上。具体..原创 2020-09-16 21:25:52 · 10999 阅读 · 7 评论 -
Unity 3D模型做半透明剪影效果
抓手项目组需要一个类似如下的半透明剪影效果,不过我们是3D模型,那么就需要一些特殊的做法。最终通过使用Stencil Buffer解决了。详解一、刚开始的的自以为是刚做这个需求之前,以为很容易做,不就是在frag shader里return一个半透明的黑色颜色值吗?然后Tags改成透明Tags { "RenderType"="Transparent" "Queue" = "Transparent" }混合模式为Blend SrcAlpha OneMinusSr...原创 2020-08-04 19:37:11 · 2032 阅读 · 1 评论 -
Unity SRP Batcher的工作原理
抓手根据我的理解总结,SRP Batcher就是1、把调用draw call前,一大堆CPU的设置工作给一口气处理了,增加了效率。2、把材质的属性数据直接永久放入到显卡的CBUFFER里,那只要数据不变,CPU就可以不需要把这些数据重新做设置工作。节省了CPU调用,增加了效率。3、用专用的代码将引擎的属性(比如objects transform)直接放入到GPU显存,这个专用的代码是不是更快更强呢,官方是这样么说的,用的词语是quickly,就是快。具体的解释SRP Batc原创 2020-07-31 16:18:17 · 5691 阅读 · 3 评论 -
Unity 性能优化 之 非常酷的SRP Batcher!
概述既然用到了URP管线,那么在做渲染优化的时候,就需要针对URP管线做相应的优化。今天发现了除了动态batching和静态batching以外的一个非常酷炫的batching,那就是SRP Batching。因为动态batching限制较多,包括模型顶点不能超过300个,shader的顶点属性不能超过900个(假如你的vertex shader用到了vertex position,normal,一个uv,那300个顶点*3 = 900,这样计算的),并且材质和贴图得必须一致,还不能用材质的co原创 2020-07-30 16:10:11 · 4807 阅读 · 7 评论 -
Unity URP管线如何截屏,及热扰动(热扭曲)效果的实现
概述URP管线环境下,GrapPass是失效的。那么,有什么替代方法呢。除了RenderTexture以外,今天发现了一个方法。那就是URP自带的OpaqueTexture。在ShaderGraph的节点就是SceneColor。顾名思义,OpaqueTexture就是渲染完不透明物体后截屏的图,我没完全明白为什么Unity不把半透明的物体也截进去。有可能是因为某些设备半透明物体必须在完全渲染完毕后才能输出到屏幕上,而截屏等不到那一个阶段,因为截屏的图片也用于渲染物体呀,这就原创 2020-07-28 15:15:21 · 11489 阅读 · 1 评论 -
Unity Shader如何判断某个属性(或某张贴图)没有赋值
概述因为有时候写shader的时候,如果某张贴图不赋值,其实完全可以不处理它们的。我看unity内置的一些shader可以通过某个关键字或宏来判断。但是之前没研究他们的具体写法。今天发现了可以用ShaderGUI来实现这个功能。具体做法先写一个ShaderGUI,比如说,我要判断某张贴图是否赋值了。using System.Collections;using UnityEngine;using UnityEditor;using System;public class S原创 2020-07-17 15:27:40 · 3408 阅读 · 4 评论 -
Unity Tilemap 添加相应的法线贴图、高光贴图等等(超便捷方法)
概述项目组需要不同的地块用不同的法线贴图和高光、粗糙贴图等等。但是我们用的是集成到unity里的 tile map。它们的代码并非是开源的,重要的渲染方式的代码都写在C++里。拓展性非常不友好。尝试过用MaterialPropertyBlock去修改,但是因为拿不到每种地块渲染前的代码,所以根本不知道怎么去替换法线贴图。终于在查找资料的时候,无意中找到了Unity官方自带的一种方法:Sprite Editor: Secondary Textures !!!!!详细介绍因为t.原创 2020-07-13 17:51:30 · 1721 阅读 · 0 评论 -
如何把Unity surf shader翻译为vert frag shader(懒人方法)
起因因为Unity URP环境下,surf shader是会失效的。所以必须把surf shader 翻译为vert frag方式的shader。因为不太明白surf里的Lighting 函数是怎么生效的。查阅了一些资料,终于找到了一个懒人方法。以下就是具体的操作:一,选择要翻译的shader,点击Show generated code。这时候就会在IDE中显示已经生成的vert frag shader,但是里面的代码有很多冗余,变体的东西。二、我们只需把里面的surf函数、原创 2020-06-23 10:50:39 · 1231 阅读 · 1 评论 -
Unity的URP的自定义后处理效果
概述本来想写这个很久了,但是一直都在忙别的。最近项目也需要用到URP的后处理,但是不一定有想要的后处理效果。所以有些还是得自己写。但是URP的后处理和之前unity的后处理写法完全不一样了。原来的OnRenderImage、OnPreRender都失效了。本文只探讨如何写URP下的自定义后处理,并非讨论具体的渲染效果,这里我只做了修改对比度的屏幕特效。具体实现首先需要创建一个自定义的c#的ScriptableRendererFeature和ScriptableRenderPass原创 2020-06-16 20:11:14 · 13467 阅读 · 4 评论 -
Unity只在一个面片上实现真实水体渲染
概述因为前一版卡通水体制作人觉得效果一般,所以换成了《海岛纪元》这种风格的水体。这次我使用截帧工具,本来打算复刻一版的,后来发现他们貌似不是用unity做的。代码风格有点不一样。其实是因为我看不懂他们的代码。。这次使用RenderDoc来截帧,效果还不错。具体实现通过截帧工具可以看到:生成浪花的贴图是由lightmap和一个Rays贴图来渲染的。而且浪花是单独一个mesh,这波操作其实我是看不懂的。原本以为通过shader在一个面片上就可以实现类似效果。他们浪花的渲染原创 2020-06-16 11:44:46 · 3052 阅读 · 1 评论 -
Unity只在一个面片上实现卡通水效果
概述因为项目要做广大世界那种水效果。想过用类似九宫格之类的来实现。但是CPU压力比较大。也试过用通过世界坐标采样河流数据贴图的方式,来不断刷新跟随摄像机的一个面片。理论上是可以的,但实际上,会有抖动的效果,初步分析的原因是世界坐标移动的位置要刚好等于偏移整数个采样的像素的距离才不会抖动。但是具体怎么改真是头疼。所以想采用一个最简单,也是有点蠢的方式,就是只使用一个面片。笼罩在整个世界地图上,并通过采样河流数据贴图的数据把整个水体渲染出来。这样一来只用到GPU渲染,CPU压力几乎忽略不原创 2020-06-09 20:17:11 · 1691 阅读 · 1 评论 -
如何在Unity的URP下使用多pass(multi pass)
Unity的工程如果从内置pipeline工程升级到URP的,多pass的shader,可能第二个pass后都会失效。如果查看URP的源代码DrawObjectsPass.cs会发现using System.Collections.Generic;namespace UnityEngine.Rendering.Universal.Internal{ /// <summary> /// Draw objects into the given color and d原创 2020-05-21 17:55:33 · 14376 阅读 · 2 评论 -
Unity Gerstner Waves(模拟大海波浪)
之前学习了一些Gerstner Waves的知识,看了一些教程,但发现说的略不够通俗,为了便于自己理解,我自己来写一个给自己的教程吧。该教程会有三个步骤,一阐述原理,二给出源码和源码解释,三提供demo下载。这样一来就算文字看不懂,也可以下载demo,运行demo,结合源码一起看,总有一种方式能让你看懂(^_^)。原理解释参考:GPU Gems的官方文档https://deve...原创 2019-08-30 15:49:31 · 7179 阅读 · 3 评论