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

Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)

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

一、 效果與引言

Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)
相信很多小伙伴都會遇到做圓角矩形的需求,網(wǎng)上的shader還不明白是怎么實現(xiàn)的,甚至還有一部分是錯誤的,本文講從原理到代碼講解圓角矩形shader的實現(xiàn)

二、 原理分析

想要實現(xiàn)一個圓角矩形,常見的是抽象成一個數(shù)學(xué)模型,如下圖紫色區(qū)域,就是我們應(yīng)該保留的區(qū)域,為了更準(zhǔn)確的描述這個圖形,我們在四個角創(chuàng)建四個相等的圓形。
Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)
因為控制每個像素的顏色主要是由片元著色器負(fù)責(zé)的,所以我們也通過Fragment Shader去實現(xiàn)這個效果,可以看到在這個函數(shù)里我們只能拿到 uv和vertex,所以我們根據(jù)uv坐標(biāo)判定是否在上圖的紫色區(qū)域,如果在則返回原本的顏色,如果不在返回完全透明的顏色。
(對每個像素都會執(zhí)行一次frag函數(shù)獲取真正渲染的顏色)

struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };
            
 fixed4 frag (v2f i) : SV_Target
 {
 	//....省略
 }

因為我們通過uv來判斷是否是紫色區(qū)域,所以我們需要先了解uv坐標(biāo)系
首先我們要了解UV坐標(biāo)系,這并不是什么高深的數(shù)學(xué)概念,而是一個簡單的道理。
首先,我們把水平方向定義為X軸,豎直方向為Y軸,把圖片左下角定義為(0,0),右上角定義為(1,1),其他的坐標(biāo)以此類推

Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)

讀者可能會產(chǎn)生疑惑,為什么xy兩個軸長度不同,但是坐標(biāo)卻不相同?
筆者暫時只能這樣描述:我們就如此定義一個坐標(biāo)系,x軸和y軸單位長度不同

我們需要用戶去調(diào)整四個圓形的半徑 設(shè)為Radius,因為uv坐標(biāo)系的xy單位長度不同,我們設(shè)Ratio = Height/Width,Ratio即為y軸單位長度與x軸單位長度之比。

float Radius 圓形半徑
float Ratio Y單位長度/X單位長度

接下來我們在圖上畫四個圓形并作輔助線

Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)
通過觀察,我們可以發(fā)現(xiàn)以下特征

1.只有在紅色區(qū)域才有可能被舍棄
2.三個圓形R2,R3,R4對應(yīng)紅色區(qū)域的任意一個位置,都能在R1內(nèi)找到等價位置
3. UV坐標(biāo)轉(zhuǎn)正常坐標(biāo)的公式為 f (x ,y)= (uv.x , uv.y * Ratio)

在UV坐標(biāo)內(nèi),我們無法通過x2 + y2 來計算長度,因為uv坐標(biāo)的xy單位不同,所以我們通過上述的坐標(biāo)轉(zhuǎn)換公式來轉(zhuǎn)化為相同的坐標(biāo)系

我們需要按以下步驟進(jìn)行處理

1.將白色區(qū)域坐標(biāo)在左下角找到等價uv坐標(biāo),position = abs(step(0.5,uv) - uv)
Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)
2.判斷等價uv是否在左下角可能舍棄區(qū)域,uv.x<Raduis && uv.y < Radius * Ratio
如果不在,則返回原色,如果在則進(jìn)入下一步

Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)
3. 求圓心距 distance = [f(uv.x,uv.y) - f(Radius,Radius)]的長度
如果大于半徑則返回fixed(0,0,0,0),否則返回原色

Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)

三、著色器代碼

在shader內(nèi)盡量不要使用if語句
Unity 圓角矩形Shader實現(xiàn)(支持長方形)(只寫兩行)
以上來著自Hking_Auditore 大大的Shader入門書,通常我們用step和lerp等來代替if
step函數(shù)的邏輯可以等價為

step (a, x)
{
  if (a>x)  return 0;
  else return 1;
}

接下來的代碼雖然看著多,實際上我們只寫了兩行
這就是這兩行

 float2 p = abs(step(0.5,i.uv) - i.uv);
 fixed4 col =  tex2D(_MainTex, i.uv) * (step(_Radius,p.x) ||step( _Radius  ,p.y*_Ratio) || step(length(float2(p.x-_Radius,p.y*_Ratio-_Radius)),_Radius));

這是完整的著色器代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-441621.html

Shader "Unlit/MyShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Radius ("Radius",float) = 0
        _Ratio("Height/Width",float )= 1
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue" = "Transparent"}
        LOD 100
        Blend SrcAlpha OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float _Radius;
            float _Ratio;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {  
            	//坐標(biāo)等價到左下角
                float2 p = abs(step(0.5,i.uv) - i.uv);
                //三個條件同時成立則乘0,否則乘1
                //1.在左下角  ,2.長度超過半徑
                fixed4 col =  tex2D(_MainTex, i.uv) * (step(_Radius,p.x) ||step( _Radius  ,p.y*_Ratio) || step(length(float2(p.x-_Radius,p.y*_Ratio-_Radius)),_Radius));
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            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),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

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

相關(guān)文章

  • 【前端知識】Three 學(xué)習(xí)日志(十)—— 常見幾何體(長方體、球體、圓柱、矩形平面、圓形平面)

    【前端知識】Three 學(xué)習(xí)日志(十)—— 常見幾何體(長方體、球體、圓柱、矩形平面、圓形平面)

    Three 學(xué)習(xí)日志(十)—— 常見幾何體(長方體、球體、圓柱、矩形平面、圓形平面) 一、構(gòu)建常用幾何體 二、 遍歷加入場景中 三、效果展示 四、完整代碼

    2024年02月07日
    瀏覽(26)
  • NSBezierPath繪制圓角矩形的圓角不夠圓滑?

    在Macos應(yīng)用開發(fā)過程中,使用OC語言編碼,效果是:圓角的線寬 比 邊框的 大或者濃。 經(jīng)過大量查詢,發(fā)現(xiàn):如果圓角矩形寬高和View的寬高一樣大,就導(dǎo)致圓角矩形的邊框線有一半在View外面而被裁剪。 調(diào)整后的代碼如下: 參考鏈接: https://outofmemory.cn/web/1018338.html? ?? htt

    2024年02月10日
    瀏覽(30)
  • css不規(guī)則圓角矩形

    css不規(guī)則圓角矩形

    這個收集的css 效果是真的多 https://github.com/chokcoco/iCSS強烈推薦

    2024年02月20日
    瀏覽(32)
  • android:繪制圓角矩形,橢圓形

    一、前言:在我們工作中會有繪制不同圓角的按鈕圖形,具體該怎么做之前也只是了解個大概,今天看了一節(jié)課,聽完老師講的我自己又寫了一遍,記錄一下。 二、代碼展示: 首先先創(chuàng)建一個DrawableShapeActivity 相對應(yīng)的xml 以及兩個形狀xml:shape_oval_rose.xml shape_ract_gold.xml

    2024年02月06日
    瀏覽(26)
  • Qt QWidget 抗鋸齒圓角窗口的一個實現(xiàn)方案(支持子控件)

    Qt QWidget 抗鋸齒圓角窗口的一個實現(xiàn)方案(支持子控件)

    由于 QWidget::setMask 接口設(shè)置圓角不支持抗鋸齒,所以通常會使用透明窗口加圓角背景,但圓角背景不能滿足對子控件的裁剪,子控件與圓角區(qū)域重疊的部分還是能顯示出來。當(dāng)然對于大多數(shù)窗口,留出足夠的邊距也是可以接受。 對一些特殊場景,比如QComboBox的列表框,UI設(shè)計

    2023年04月24日
    瀏覽(39)
  • 在Unity中編寫Shader的編譯器環(huán)境配置(支持CG和HLSL)

    Unity默認(rèn)使用的編譯器VisualStudio帶有擴(kuò)展插件ShaderLabVS,但功能很差,所以還是選用VisualStudioCode作為編寫Shader的編譯器,一方面其能自動識別Shaderlab語法,并且還有豐富的Shader擴(kuò)展插件來輔助編寫。 實際上編寫時我們只希望.shader文件有VSCODE打開,其他腳本正常還是用VS,可以

    2024年02月15日
    瀏覽(30)
  • 【零基礎(chǔ)學(xué)web前端】CSS學(xué)習(xí),字體屬性,文本屬性,背景屬性,圓角矩形屬性

    【零基礎(chǔ)學(xué)web前端】CSS學(xué)習(xí),字體屬性,文本屬性,背景屬性,圓角矩形屬性

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我們了解了CSS引入方式,CSS基礎(chǔ)選擇器,CSS復(fù)合選擇器,今天我們繼續(xù)學(xué)習(xí)CSS的相關(guān)知識點.???? ??個人主頁:良辰針不戳 ??所屬專欄:零基礎(chǔ)學(xué)web前端 ??勵志語句:生活也許會讓我們遍體鱗傷,但最終這些傷口會成為我們一輩子的

    2024年02月05日
    瀏覽(31)
  • 數(shù)字圖像處理(實踐篇)二十九 OpenCV-Python在圖像中檢測矩形、正方形和三角形的實踐

    數(shù)字圖像處理(實踐篇)二十九 OpenCV-Python在圖像中檢測矩形、正方形和三角形的實踐

    目錄 1 方案 2 實踐 1 方案 ①檢測矩形和正方形 ⒈檢測圖像中的所有輪廓。 ⒉循環(huán)檢查所有檢測到的輪廓。 ⒊為每個輪廓找到近似的輪廓。如果近似輪廓中的頂點數(shù)為4,則計算 寬高比 用來區(qū)分 矩形 和 正方形 。如果寬高比在0.9到1.1之間,則認(rèn)為為正方形,否則的話,則為

    2024年01月25日
    瀏覽(99)
  • 【unity】URP的shader開發(fā)中支持多光源,_ADDITIONAL_LIGHTS_VERTEX 和 _ADDITIONAL_LIGHTS 區(qū)別

    【unity】URP的shader開發(fā)中支持多光源,_ADDITIONAL_LIGHTS_VERTEX 和 _ADDITIONAL_LIGHTS 區(qū)別

    項目里有一個其他同事實現(xiàn)的shader,美術(shù)那邊希望能支持多個光源, 我一看代碼里面, frag 函數(shù)里已經(jīng)實現(xiàn)了 ? 代碼也加了: ?? ??? ??? ?#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS 材質(zhì)里加了這個keyword還是沒起作用,? ?若宏控制注了有效。? 一開始沒搞明白

    2024年02月11日
    瀏覽(34)
  • 【Vuforia+Unity】AR02-長方體物體識別

    【Vuforia+Unity】AR02-長方體物體識別

    ? 選擇多維長方體圖,這個長方體是生活中的真實物體的拍攝圖,提前把6個面拍攝好并裁剪干凈。 官網(wǎng)創(chuàng)建模型 https://developer.vuforia.com/targetmanager/project/targets?projectId=0ddbb5c17e7f4bf090834650bbea4995av=false ?設(shè)置長寬高,這個長寬高需要與真實物體的長寬保持一樣的比例 提前處理好

    2024年02月21日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包