国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity Shader學習(九)物體邊緣實現(xiàn)

這篇具有很好參考價值的文章主要介紹了Unity Shader學習(九)物體邊緣實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

根據(jù)前面的學習,我們了解到除了可以對點的顏色進行處理,還可以對點本身進行操作,例如我們可以改變點的位置,這樣就可以實現(xiàn)對模型渲染的操控。物體邊緣效果是我們常用的一種效果,要實現(xiàn)物體邊緣,原理也很簡單。
首先我們要了解到,模型在渲染時,有正面和背面之分,背面一般是不渲染,進行剔除,我們看到的模型往往是正常渲染正面,如下圖所示:
unityobjecttoclippos,unity,Unity開發(fā),游戲開發(fā),unity,學習,游戲引擎,shader
了解到這,因此我們可以控制是否顯示正面或者背面。進一步了解物體輪廓,物體輪廓其實就是物體在顯示的屏幕上最外側(cè)的邊緣部分,因此要對模型最外部的邊緣部分進行處理,如上圖的邊緣部分就是立方體的幾條邊,如下圖所示,紅色所在范圍即為邊緣部分。為了獲取到邊緣部分,需要將點轉(zhuǎn)換到裁切空間進行處理。
unityobjecttoclippos,unity,Unity開發(fā),游戲開發(fā),unity,學習,游戲引擎,shader
關(guān)于裁剪空間,參考裁剪空間這篇文章
說明白點,裁剪空間就是攝像機視野范圍內(nèi)的一個矩陣轉(zhuǎn)換空間,在該空間內(nèi)可以進行點處理。首先,我們把邊緣處理的流程分為兩個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函數(shù),可以將模型空間的點轉(zhuǎn)換到裁剪空間,下面這行在原來點的基礎(chǔ)上,乘以法線點和輪廓值,向外延伸,如下圖所示。

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

unityobjecttoclippos,unity,Unity開發(fā),游戲開發(fā),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開發(fā),游戲開發(fā),unity,學習,游戲引擎,shader
完整code:文章來源地址http://www.zghlxwxcb.cn/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
        }

    }
}

到了這里,關(guān)于Unity Shader學習(九)物體邊緣實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Unity Shader 學習筆記】ShaderLab

    【Unity Shader 學習筆記】ShaderLab

    什么是ShaderLab? ShaderLab是Unity為開發(fā)者提供的高層級的渲染抽象層,是專門用來編寫UnityShader的一種說明性語言。 Unity shader的基本結(jié)構(gòu) 材質(zhì)和Unity Shader的橋梁:Properties Properties語義塊包含了一系列屬性,這些屬性會顯式的出現(xiàn)在材質(zhì)面板中。便于開發(fā)者在材質(zhì)面板中能夠方便

    2023年04月26日
    瀏覽(25)
  • Unity Shader學習3:透明效果

    Unity Shader學習3:透明效果

    Unity中的透明效果由透明通道控制(RGBA中的A),其值為0是完全透明,為1時完全不透明。有兩種方法可以實現(xiàn)透明效果: 透明度測試(Alpha Test) 和 透明度混合(Alpha Blend) 。 透明度測試是指通過特定的條件(通常是Alpha通道的值是否超過某個閾值)來判斷片元是否透明,只

    2024年01月19日
    瀏覽(84)
  • Shader學習第七篇:幾種Unity的Shader的例子

    下面是幾種Shader的例子,從簡單到復(fù)雜,一步一步了解 Shader 的編寫機制。 頂點/片元著色器 Vertex/Fragment Shader,下面我們介紹的示例就是這個。 表面著色器 Surface Shader ,而這個底層Unity也是轉(zhuǎn)成了頂點/片元著色器 固定函數(shù)著色器 Fixed Function Shader (已棄用) 在一些低端設(shè)備使

    2024年02月09日
    瀏覽(15)
  • Unity Shader學習1:基礎(chǔ)光照模型

    Unity Shader學習1:基礎(chǔ)光照模型

    Phong光照模型 是描述物體的直接光照的簡易模型,它認為從物體出發(fā)進入攝像機的光由四部分組成: 自發(fā)光(emissive),環(huán)境光(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日
    瀏覽(24)
  • Unity Shader入門精要學習——透明效果

    Unity Shader入門精要學習——透明效果

    要么完全透明,要么完全不透明。 實現(xiàn)簡單,實質(zhì)上是一種剔除機制,通過將不滿足條件(通常使用小于某個閾值來判定,一般使用clip方法)的片元舍棄的方法來達到完全透明效果。這些被舍棄的片元不會再進行任何的處理,也不會對顏色緩沖產(chǎn)生任何影響,其余滿足條件

    2024年02月17日
    瀏覽(22)
  • 學習100個Unity Shader (14) ---透明效果

    學習100個Unity Shader (14) ---透明效果

    由”Queue“ 標簽決定,索引號越小越早被渲染: 名稱 隊列索引號 Background 1000 Geometry 2000 AlphaTest 2450 Transparent 3000 Overlay 4000 某一片元的透明度小于某個閾值,即被舍棄,反之,按非透明物體處理,進行正常的深度測試和深度寫入【不需要關(guān)閉深度寫入】。 UnityObjectToClipPos 將頂

    2024年04月29日
    瀏覽(22)
  • UnityShader入門學習(三)——Unity的Shader

    UnityShader入門學習(三)——Unity的Shader

    Tags Tags可以寫在SubShader的一開始(所有的Pass用),也可以寫在Pass塊的內(nèi)部(該Pass用) 渲染設(shè)置 同Tags一樣也可以寫在Pass中或者寫在Pass外面(SubShader一開始) Pass介紹 Pass里面可以定義Pass名稱 Pass里面的Tags還可以有額外的設(shè)置 還有CG語言所寫的代碼,主要是頂點片元著色器,

    2024年02月16日
    瀏覽(24)
  • 【Unity Shader】Unity中利用GrabPass實現(xiàn)玻璃效果

    【Unity Shader】Unity中利用GrabPass實現(xiàn)玻璃效果

    《入門精要》中模擬玻璃是用了Unity里的一個特殊的Pass來實現(xiàn)的,這個Pass就是 GrabPass ,比起上一篇博客實現(xiàn)鏡子的方法,這個方法我認為相對復(fù)雜,因此在實現(xiàn)之前需要對GrabPass及實現(xiàn)原理做一個更加詳細的介紹。 場景物體拜訪和貼圖完全參考《入門精要》: 以及當前場景

    2024年02月09日
    瀏覽(36)
  • unity GI Shader 實現(xiàn)

    unity GI Shader 實現(xiàn)

    之前分享了一篇對unity全局光照的解析,里面提到了一些東西,需要在Shader內(nèi)實現(xiàn),在這一篇補上。 要實現(xiàn)對全局GI的shader實現(xiàn),我們可以通過對unity內(nèi)置的Lit進行解析查看。 烘焙的方式有很多種,選擇合適的方式烘焙和使用合適類型的光源尤為重要。 首先,我們先實現(xiàn)一下

    2024年02月10日
    瀏覽(16)
  • 【Unity】Unity Shader學習筆記(四)創(chuàng)建和使用、基本語法、屬性基本類型、數(shù)值精度

    【Unity】Unity Shader學習筆記(四)創(chuàng)建和使用、基本語法、屬性基本類型、數(shù)值精度

    由于著色器是依賴于材質(zhì)的,所以創(chuàng)建著色器之前通常要先創(chuàng)建一個材質(zhì)(Material)。然后再創(chuàng)建一個Shader。 結(jié)果如下: 然后給材質(zhì)指定Shader,再給物體指定材質(zhì)。 建好Shader后雙擊打開,通常默認使用vs studio開發(fā)shader。一個Shader主要的內(nèi)容都是寫在 Shader {} 代碼塊中,其中包

    2024年02月16日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包