Unity Shader学习(九)物体边缘实现

这篇具有很好参考价值的文章主要介绍了Unity Shader学习(九)物体边缘实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

根据前面的学习,我们了解到除了可以对点的颜色进行处理,还可以对点本身进行操作,例如我们可以改变点的位置,这样就可以实现对模型渲染的操控。物体边缘效果是我们常用的一种效果,要实现物体边缘,原理也很简单。
首先我们要了解到,模型在渲染时,有正面和背面之分,背面一般是不渲染,进行剔除,我们看到的模型往往是正常渲染正面,如下图所示:
unityobjecttoclippos,unity,Unity开发,游戏开发,unity,学习,游戏引擎,shader
了解到这,因此我们可以控制是否显示正面或者背面。进一步了解物体轮廓,物体轮廓其实就是物体在显示的屏幕上最外侧的边缘部分,因此要对模型最外部的边缘部分进行处理,如上图的边缘部分就是立方体的几条边,如下图所示,红色所在范围即为边缘部分。为了获取到边缘部分,需要将点转换到裁切空间进行处理。
unityobjecttoclippos,unity,Unity开发,游戏开发,unity,学习,游戏引擎,shader
关于裁剪空间,参考裁剪空间这篇文章
说明白点,裁剪空间就是摄像机视野范围内的一个矩阵转换空间,在该空间内可以进行点处理。首先,我们把边缘处理的流程分为两个pass,一个处理剔除正面的渲染,一个处理正面的正常渲染。
第一个pass:

 Pass
        {
            //剔除正面   只看背面
            Cull Front
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float _Outline;
            float4 _OutlineColor;

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex + normalize(v.vertex) * _Outline);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                return _OutlineColor;
            }

            ENDCG
        }

使用UnityObjectToClipPos函数,可以将模型空间的点转换到裁剪空间,下面这行在原来点的基础上,乘以法线点和轮廓值,向外延伸,如下图所示。

 o.pos = UnityObjectToClipPos(v.vertex + normalize(v.vertex) * _Outline);

unityobjecttoclippos,unity,Unity开发,游戏开发,unity,学习,游戏引擎,shader
完成背面处理的pass后,进行正常的pass处理,不需要添加cull,默认渲染只正面,代码如下:

 Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            sampler2D _MainTex;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }

整体的效果如下:
unityobjecttoclippos,unity,Unity开发,游戏开发,unity,学习,游戏引擎,shader
完整code:文章来源地址https://www.toymoban.com/news/detail-599461.html

Shader "Custom/Study/Simple Outline"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}

        _Outline ("Outline", Range(0, 1)) = 0.1
        _OutlineColor ("Outline Color", Color) = (1,1,1,1)
    }

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            //剔除正面   只看背面
            Cull Front

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float _Outline;
            float4 _OutlineColor;

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex + normalize(v.vertex) * _Outline);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                return _OutlineColor;
            }

            ENDCG
        }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            sampler2D _MainTex;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }

    }
}

到了这里,关于Unity Shader学习(九)物体边缘实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity Shader 学习笔记】ShaderLab

    什么是ShaderLab? ShaderLab是Unity为开发者提供的高层级的渲染抽象层,是专门用来编写UnityShader的一种说明性语言。 Unity shader的基本结构 材质和Unity Shader的桥梁:Properties Properties语义块包含了一系列属性,这些属性会显式的出现在材质面板中。便于开发者在材质面板中能够方便

    2023年04月26日
    浏览(26)
  • Unity Shader学习3:透明效果

    Unity中的透明效果由透明通道控制(RGBA中的A),其值为0是完全透明,为1时完全不透明。有两种方法可以实现透明效果: 透明度测试(Alpha Test) 和 透明度混合(Alpha Blend) 。 透明度测试是指通过特定的条件(通常是Alpha通道的值是否超过某个阈值)来判断片元是否透明,只

    2024年01月19日
    浏览(49)
  • Shader学习第七篇:几种Unity的Shader的例子

    下面是几种Shader的例子,从简单到复杂,一步一步了解 Shader 的编写机制。 顶点/片元着色器 Vertex/Fragment Shader,下面我们介绍的示例就是这个。 表面着色器 Surface Shader ,而这个底层Unity也是转成了顶点/片元着色器 固定函数着色器 Fixed Function Shader (已弃用) 在一些低端设备使

    2024年02月09日
    浏览(41)
  • Unity Shader学习1:基础光照模型

    Phong光照模型 是描述物体的直接光照的简易模型,它认为从物体出发进入摄像机的光由四部分组成: 自发光(emissive),环境光(ambient),漫反射(diffuse),高光(specular)。 c = c e m i s s i v e + c a m b i e n t + c d i f f u s e + c s p e c u l a r c = c_{emissive} + c_{ambient} + c_{diffuse} + c_

    2024年02月03日
    浏览(36)
  • Unity Shader入门精要学习——透明效果

    要么完全透明,要么完全不透明。 实现简单,实质上是一种剔除机制,通过将不满足条件(通常使用小于某个阈值来判定,一般使用clip方法)的片元舍弃的方法来达到完全透明效果。这些被舍弃的片元不会再进行任何的处理,也不会对颜色缓冲产生任何影响,其余满足条件

    2024年02月17日
    浏览(35)
  • UnityShader入门学习(三)——Unity的Shader

    Tags Tags可以写在SubShader的一开始(所有的Pass用),也可以写在Pass块的内部(该Pass用) 渲染设置 同Tags一样也可以写在Pass中或者写在Pass外面(SubShader一开始) Pass介绍 Pass里面可以定义Pass名称 Pass里面的Tags还可以有额外的设置 还有CG语言所写的代码,主要是顶点片元着色器,

    2024年02月16日
    浏览(32)
  • 学习100个Unity Shader (14) ---透明效果

    由”Queue“ 标签决定,索引号越小越早被渲染: 名称 队列索引号 Background 1000 Geometry 2000 AlphaTest 2450 Transparent 3000 Overlay 4000 某一片元的透明度小于某个阈值,即被舍弃,反之,按非透明物体处理,进行正常的深度测试和深度写入【不需要关闭深度写入】。 UnityObjectToClipPos 将顶

    2024年04月29日
    浏览(30)
  • 【Unity Shader】Unity中利用GrabPass实现玻璃效果

    《入门精要》中模拟玻璃是用了Unity里的一个特殊的Pass来实现的,这个Pass就是 GrabPass ,比起上一篇博客实现镜子的方法,这个方法我认为相对复杂,因此在实现之前需要对GrabPass及实现原理做一个更加详细的介绍。 场景物体拜访和贴图完全参考《入门精要》: 以及当前场景

    2024年02月09日
    浏览(33)
  • unity GI Shader 实现

    之前分享了一篇对unity全局光照的解析,里面提到了一些东西,需要在Shader内实现,在这一篇补上。 要实现对全局GI的shader实现,我们可以通过对unity内置的Lit进行解析查看。 烘焙的方式有很多种,选择合适的方式烘焙和使用合适类型的光源尤为重要。 首先,我们先实现一下

    2024年02月10日
    浏览(28)
  • 【Unity】Unity Shader学习笔记(四)创建和使用、基本语法、属性基本类型、数值精度

    由于着色器是依赖于材质的,所以创建着色器之前通常要先创建一个材质(Material)。然后再创建一个Shader。 结果如下: 然后给材质指定Shader,再给物体指定材质。 建好Shader后双击打开,通常默认使用vs studio开发shader。一个Shader主要的内容都是写在 Shader {} 代码块中,其中包

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包