unity shader基于后处理的硬描边

Unity URP】探讨描边方案 自定义后处理Volume 讨论了描边方案,并自定义个Volume和RenderFeature面板,为后续实现后处理描边的Pass做准备。 阅读详情

       网上的描边实现大部分都是法线外扩、模板、后处理这种的,我想实现一个类似U3D编辑界面那种硬质描边,法线外扩的缺点大部分人都知道:遇到“硬边”,法线外扩就会造成描边断裂,非常影响美观。模板又要修改模型材质操作有点复杂。而后处理就挺简单修改模型的显示层单独渲染一遍就ok了,但是目前网上描边都做成了“自发光”,边不够“硬”,而且由于模型上需要绑碰撞,换层有点不“合理”;了解到CommandBuffer可以解决这个顾虑,需要操作的仅是把模型添加入CommandBuffer单独绘制即可,很满足我的需求,那就改一下吧。

        首先需要软描边(类自发光)的大佬可以参考这篇文章,我也是参考这个大佬改的:传送门

        具体操作是首先新建脚本OutLineCameraComponent.cs,拷贝上代码并挂载到主相机上。

/****************************************************
   文件:OutLineCameraComponent.cs
   名称:后处理描边相机组件
   说明:使用时需要将脚本挂载到三维模型相机上。主要参考文章:https://blog.csdn.net/vikingsc2007_1/article/details/76570931
   
   by--Sep
*****************************************************/
using System;
using UnityEngine;  
using System.Collections.Generic;
using UnityEngine.Rendering;  


// [ExecuteInEditMode]
public class OutLineCameraComponent : MonoBehaviour
{  
    private RenderTexture renderTexture = null;  
    private CommandBuffer commandBuffer = null;  
    
    private RenderTexture temp1 = null;  
    private RenderTexture temp2 = null;  

    [Header("单色shader")]
    public Shader preoutlineShader = null;  
   [Header("描边shader")]
     public Shader shader = null;

     private Material _preoutlineMaterial = null;
    private Material _material = null;
    public Color outLineColor;

    public Material mMaterial
    {
        get
        {
            if (_material == null)
            {
                _material = GenerateMaterial(shader);
                _material.SetColor("_OutlineColor", outLineColor);  
            }
            return _material;
        }
    }
    [Header("降分辨率,与描边宽度对应")]
    public int downSample = 2;  

    [Header("描边强度")]
    [Range(0.0f, 10.0f)]  
    public float outLineStrength = 3.0f;  

    //目标对象  
    private BaseModel targetModel;

    private void Awake()
    {
        _preoutlineMaterial = GenerateMaterial(preoutlineShader);
        _preoutlineMaterial.SetColor("_MainColor",outLineColor);
    }

    //根据shader创建用于屏幕特效的材质
    protected Material GenerateMaterial(Shader shader)
    {
        if (shader == null)
            return null;

        if (shader.isSupported == false)
            return null
Unity Shader 屏幕后处理 使用深度和法线纹理 边缘检测 代码 using UnityEngine; public class EdgeDetectNormalsAndDepth : PostEffectsBase { public Shader edgeDetectShader; private Material edgeDetectMaterial = null; public Material mater... 阅读详情

相关推荐

UnityShader描边实现整理

描边 1、基于观察角度和表面法线的轮廓线渲染 基本思路:以归一化的顶点到摄像机的向量和归一化的顶点法线向量的点乘为参考值,该值越小(越接近于0),该像素就越解决于边缘。 优点:简单快速,只需要一个Pass。 缺点:局限性大,很多模型渲染出的效果不尽人意。 Shader "Unlit/RimLight" { Properties { _RimColor("RimColor",Color) = (1,1,1,1) _RimPower("Power",Rang

weixin_42872938的博客 1701

最好用描边shader

在网上找到的在unity中使用最好的描边着色器shader。该文件里面总共有12个项目,2个为一组,共有6种表面着色器shader。 【功能】改着色器成功的解决了一般的描边shader存在有以下问题: 1,会丢失原来的材质 2,效果不好 【使用方法/注意事项】 1,文件夹需要保存在英文路径下,路径中不能包含中文字符 2,在导入时候,一个shader包含两个文件:xxx.shader和xxx.shader.meta.shader。这两个文件需要同时拖动到Assets下面包含的目录下

Unity URP卡通着色实战:从原理Shader Graph实现

卡通渲染(Toon Shading)是一种通过离散化和风格化处理光照,模拟手绘或动漫视觉风格的非真实感渲染技术。其核心原理在于将连续的光照计算(如NdotL)通过色阶化(Ramp Shading)或阶梯函数进行量化,形成清晰的明暗色块与朗的明暗交界线,从而打破基于物理渲染(PBR)的连续光影过渡。这项技术在游戏开发中具有重要价值,能快速确立独特的美术风格,增强艺术表现力。其应用场景广泛,尤其在二次元、卡通风格或独立游戏中,用于角色、场景的风格化呈现。本文聚焦于在Unity通用渲染管线(URP)这一现代、高

weixin_33863087的博客 387

Shader 学习笔记:描边

好久没写博客了,最近在整毕业论文,码的字也比较多,但是博客想起来好久没碰过了。在整毕设的时候,尝试着解决了一些自己很久没有完成的心病,也做了一些效果来玩一玩,这次把这个东西记一下,以后有需求可以随时拿起来用。 今天的博客记一下关于后处理描边方法,说起描边还是比较简答的,在杂记那一篇中,记录了根据模型本身来构建描边的方法, 虽然特别特别水,而且对于模型法线来说要求贼高。在我的毕设中,使用了Mag...

MEIGAZAMU 1604

UnityShader基础案例(五)——物体描边

物体描边有两种大方式,一个是扩充模型,一个是基于屏幕后处理以及可能其他等等。

SliverAsh_的博客 5613

Unity描边效果优化:从屏幕后处理到几何体膨胀方案详解

在实时渲染中,描边(Outline)是一种常见的技术,用于高亮交互对象或实现卡通风格渲染。其核心原理通常分为屏幕空间后处理和几何体膨胀两大类。屏幕空间方法通过卷积算子(如Sobel)对深度或法线纹理进行边缘检测,虽然实现直接,但存在性能开销大、边缘闪烁等固有问题,尤其在移动端可能成为性能瓶颈。相比之下,基于几何体膨胀的双Pass渲染方案,通过顶点着色器沿法线方向扩展模型表面并优先渲染,再利用深度测试实现描边,不仅性能更优、效果稳定,且与后期处理兼容性更好。对于Unity开发者而言,理解这两种方案的底层机制,

weixin_29008055的博客 244

Unity卡通渲染核心:Toon Shader原理实现与优化全解析

在计算机图形学中,非真实感渲染(NPR)是一类旨在模拟艺术化视觉风格而非物理真实感的技术。其核心原理是通过对传统连续光照计算进行离散化处理,例如使用色阶化(Ramp)技术将平滑的光照渐变转换为界限分明的色块,从而生成手绘卡通般的视觉效果。这种技术为游戏和动画项目提供了独特的艺术表现力与性能优势,尤其在移动平台和风格化项目中成为关键解决方案。在Unity引擎中,Toon Shader作为NPR的典型实现,通过背面挤出法等方案实现标志性的描边,并结合阈值控制、Ramp贴图采样等机制,让开发者能够高效构建二次

weixin_29016833的博客 283

Unity Shader-描边效果

简介 描边效果是游戏里面非常常用的一种效果,一般在选中物体或者NPC的时候,被选中的对象就会显示描边效果。比如最近又跑回去玩了玩《剑灵》,虽然出了三年了,在现在的网游里面画面仍然算很好的。 还有就是最常见的LOL中的塔,选中时就会看到很明显的描边效果:

puppet_master的专栏 5万+

Unity Shader-遮挡处理(X-Ray,遮挡描边,遮挡半透,遮挡溶解)

游戏中处理遮挡的几种常用的方法,遮挡溶解,遮挡描边,遮挡半透,X光效果。

puppet_master的专栏 4万+

unity shader 实现通用描边shader -文字描边-字体描边

在制作游戏时,可以遇到要对字体添加描边的需求,unity 的UGUI自带的OutLine组件,描边效果不好,宽度过大会出现穿帮,顶点数量也会增加,性能不好,如果对于有几百字,顶点数量会很多,而且无法扩展功能可以看出Outline创建了4个方向的文字Unity5.2以前的版本要求,每一个Canvas下至多只能有2^16-1=65535个顶点(使用2个字节(16位)存储顶点索引),超过就会报错以上的种种原因,让我们不得不自己编写文字图片的描边shader

qq_58047420的博客 6112

Unity 模型描边的几种方法. (Shader、GL、代码生成描绘边)

前言 1、前段时间工作,需要给模型描边,由于对Shader不熟悉,就直接网上找了描边Shader文件,无奈项目发布环境是WebGL,WebGL对Shader的需求比较特殊,故无法使用。 2、因为项目需要描边的物体并不多,所以萌生出,动态生成整个模型所有的边(线条),给各个边附上需要的材质球即可。(当然,也可以直接请美术在模型上描边,但这样不能实现泛光之类的效果) 3、现写下三种实现模型描边的方法,方便日后查看学习与使用。 实现 1、GL描边 原理比较简单,就是获取到模型的所有顶点,然后使用GL连线.

ToToTofu的博客 1万+

Unity 2D外描边Shader

今天,我们来实现一个2D外描边的效果。外描边:即在边缘透明像素周围加上一层描边,不占用原来的像素。思路:我们可以在片元着色器实现此效果,当一个像素本身不是透明的(alpha>0),那么让它返回自身的颜色;当一个像素本身是透明的,并且它上下左右4个像素的alpha值总和不等于0,那么我们可以判定该像素处于边缘,让它变成描边颜色就可以。

super41的博客 3556

Unity】用shader做UGUI字体描边的算法改进

Unity自带的Outline 效率实在太差。 找了基于Shader实现的UGUI描边解决方案http://www.cnblogs.com/GuyaWeiren/p/9665106.html 效果还不错,overdraw和顶点数都不高。 不过方案有2个问题,自己尝试调整了一下, 代码放在这以供参考吧。 (注:把ui存储prefab,运行时动态挂到一个canvas上, 这个canvas 如果...

zhenmu的专栏 1万+

Unity 基于法线和深度实现完美描边,可独立控制物体描边

Unity 后处理描边效果实现。可独立控制物体是否显示描边

weixin_38027841的博客 7551

Unity Shader-后处理:简单均值模糊

今天来学习一下后处理中比较常用的一种效果,屏幕模糊效果。屏幕模糊效果是一些高级后处理效果的基础,比如景深,运动模糊等等效果都需要用屏幕模糊效果来实现,所以我们首先看一下屏幕模糊效果,然后通过屏幕模糊,进一步学习景深效果与运动模糊效果的实现。 一.简介 二.原理介绍 三.代码实现 四.效果展示

puppet_master的专栏 1万+

Unity Shader-Command Buffer的使用(景深与描边效果重置版)

Command Buffer是Unity5新增的一个灰常灰常强大的功能。先祭出官方介绍和文档。我们在渲染的时候,给OpenGL或者DX的就是一系列的指令,比如glDrawElement,glClear等等,这些东西目前是引擎去调用的,而Unity也为我们封装了更高一级的API,也就是CommandBuffer,可以让我们更加方便灵活地实现一些效果。CommandBuffer最主要的功能是可以预定义一些列的渲染指令,然后将这些指令在我们想要的时机进行执行。本篇文章简单介绍一下CommandBuffer的使用,

puppet_master的专栏 4万+

Unity3D Shader系列之描边

参考文章 Unity Shader-描边效果 Outline Shader offset的作用 Unity Shader 中 Offset 设置的作用 Shader Depth Offset [Polygon Offset] [OpenGL][SharpGL]用Polygon Offset解决z-fighting和stitching问题

老王的博客 1万+

在URP实现局部后处理描边

欢迎参与讨论,转载请注明出处。 前言 最近在Demo开发的过程中,遇到了一个细节问题,场景模型之间的边界感很弱:   这样就会导致玩家难以分辨接下来面对的究竟是可以跳下去的台阶,亦或是要跳过去的台阶了。我们想到的解决方法便是给场景模型加个外描边,以此区分:   整挺好,于是本文就来介绍一下实现思路。首先按照惯性我们直接采用了与人物相同的法线外扩描边,但是效果却不尽人意:   这完全就牛头不对马嘴,既然老办法不好使那就看看后处理描边吧。不过由于Demo使用的渲染管线是URP,在后处理这块与原生完全不同。

Musoucrow' BLOG 3934
上一篇: 使用vscode过程中遇到的“坑”
流年Bast
博客等级 码龄12年 33粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值