免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
UnityShader快速上手指南(二)

簡介


前一篇介紹了如果編寫最基本的shader,接下來本文將會簡單的深入一下,我們先來看下效果吧


呃,gif效果不好,實際效果是很平滑的動態(tài)過渡

實現(xiàn)思路


1.首先我們要實現(xiàn)一個彩色方塊

2.讓色彩動起來

over


實現(xiàn)一個RGB CUBE


先看代碼吧:


Shader "LT/Lesson2"{    Properties {        _OffsetX ("Offset X", Range (-1.5, 1.5) ) = 0        _OffsetY ("Offset Y", Range (-1.5, 1.5) ) = 0        _OffsetZ ("Offset Z", Range (-1.5, 1.5) ) = 0    }    SubShader    {        Pass        {            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"             struct VertextOutput {                float4 pos : SV_POSITION ;                fixed4 col : COLOR ;            };            uniform float _OffsetX;            uniform float _OffsetY;            uniform float _OffsetZ;            VertextOutput vert (  appdata_base input )            {                VertextOutput result;                result.pos = mul(UNITY_MATRIX_MVP , input.vertex ) ;                result.col = input.vertex + float4( _OffsetX, _OffsetY, _OffsetZ, 0);                return result;            }            fixed4 frag ( VertextOutput input ) : COLOR            {                return input.col;            }                        ENDCG        }    }}

恩~~,首先呢,我們這次輸出的顏色不同的位置顏色不同,所以我們需要一個同時能存位置和顏色的結(jié)構(gòu)體:


            struct VertextOutput {                float4 pos : SV_POSITION ;                 // 位置信息, 后面的: SV_POSITION是必須的,當(dāng)然你也可以換成: POSITION                fixed4 col : COLOR ;                // 顏色信息, 后面的: COLOR不是必須的,你可以隨便取名字比如 : FUCK                // 但是嘛,為了代碼方便閱讀,還是寫成COLOR吧            };

然后呢我們只有這樣一個模型:



24個頂點(每個面頂點單算的),12個三角形,兩個空的UV(這個是unity自帶的cube模型)

這個模型是沒有任何顏色信息,所以我們需要自己在shader中生成他的顏色

出于方便考慮,我們將這個模型的頂點(XYZ)變成RGB的顏色,因為剛好三個值都有變化嘛

于是有了這樣的代碼

result.col = input.vertex + float4( _OffsetX, _OffsetY, _OffsetZ, 0);

前面頂點位置就不作處理了,直接換算成Unity坐標(biāo)就完了

result.pos = mul(UNITY_MATRIX_MVP , input.vertex ) ;


然后我們來說說傳入?yún)?shù)中的appdata_base

對于VertextOutput vert ( appdata_base input )這個函數(shù)命名

學(xué)過C語言的應(yīng)該知道前面是返回值類型 括號里面是傳入值類型和名字吧

然后這個appdata_base呢是定義在#include "UnityCG.cginc"的一個結(jié)構(gòu)體

(強行帶節(jié)奏引入了UnityCG.cginc,其實也可以像前面一篇一樣使用float4 position : POSITION,只是這里為了早點引入UnityCG.cginc而已)

我們可以看一下UnityCG.cginc的部分代碼:


// Dynamic & Static lightmaps contain indirect diffuse ligthing, thus ignore SH#define UNITY_SHOULD_SAMPLE_SH ( defined (LIGHTMAP_OFF) && defined(DYNAMICLIGHTMAP_OFF) )struct appdata_base {    float4 vertex : POSITION;    float3 normal : NORMAL;    float4 texcoord : TEXCOORD0;};struct appdata_tan {    float4 vertex : POSITION;    float4 tangent : TANGENT;    float3 normal : NORMAL;    float4 texcoord : TEXCOORD0;};struct appdata_full {    float4 vertex : POSITION;    float4 tangent : TANGENT;    float3 normal : NORMAL;    float4 texcoord : TEXCOORD0;    float4 texcoord1 : TEXCOORD1;    float4 texcoord2 : TEXCOORD2;    float4 texcoord3 : TEXCOORD3;#if defined(SHADER_API_XBOX360)    half4 texcoord4 : TEXCOORD4;    half4 texcoord5 : TEXCOORD5;#endif    fixed4 color : COLOR;};

整個有點小長,我只粘貼一部分,其實就是一大堆Unity的定義而已,

我們再來看看


struct appdata_base {    float4 vertex : POSITION; //位置    float3 normal : NORMAL; //法線    float4 texcoord : TEXCOORD0; // 紋理};

其實這是一個簡化的模型數(shù)據(jù),包含了一些常用的參數(shù),如果我們寫的shader主要是給手機使用的話,這些數(shù)據(jù)基本也就夠了,而且目前我們也就用了他的位置的信息,當(dāng)然你也可以傳入一個appdata_full 類型,區(qū)別不大


至于_OffsetX,_OffsetY,_OffsetZ三個外接屬性的定義就不多做贅述了

然后我們就通過


            VertextOutput vert (  appdata_base input )            {                VertextOutput result;                result.pos = mul(UNITY_MATRIX_MVP , input.vertex ) ;                result.col = input.vertex + float4( _OffsetX, _OffsetY, _OffsetZ, 0);                return result;            }

計算出了相應(yīng)頂點的顏色

然后直接在面片渲染函數(shù)中把對應(yīng)點的顏色賦值給他就行了

return input.col;

注意這里我們的傳入?yún)?shù)變成了vert 的返回值

fixed4 frag ( VertextOutput input ) : COLOR


好來看下初步的效果:



這里我們就完成了一個RBG CUBE了。

下面對一些原理性的東西簡單解釋一下


光柵化?插值?


前面我解釋過vert函數(shù)是一個頂點調(diào)用一次,這里我們的模型一共才24個頂點,但是為啥出來這么多個顏色呢,這里就跟渲染流程的光柵化有關(guān)。默認(rèn)情況下,光柵化會保持平滑過渡,如果兩邊不匹配就會在中間插值,然后對于我們的模型而言,一個面上每個頂點的顏色都不同,所以他就會自動插入很多個頂點,并且自動漸變顏色來滿足平滑過渡(也就是說如果你顏色都一樣,就不會插點了,當(dāng)然你也可以手動不讓它插點,概念比較多,這里就不展開了,我們要快速上手嘛)


讓顏色隨著時間變化而變化


這里是我強行要加的一個功能,不然感覺這篇blog就太少內(nèi)容咯,哈哈

有兩種實現(xiàn)方法:

1.unity中通過C#代碼去控制剛才開放出來的參數(shù)

2.shader中自己通過時間去更改顏色

我們既然是學(xué)shader,當(dāng)然是在shader中進行更改啦

直接上代碼:


result.col = input.vertex + float4( _SinTime.w + 0.5, _SinTime.w + 0.5, _SinTime.w + 0.5, 0);

呃,對,就改這一行。效果就是實現(xiàn)啦,大家可以自己行試一下

下面解釋一小下下:

_SinTime是unity為shader內(nèi)置的一個時間的sin值得變量(看名字也看的出來吧)

需要引入#include "UnityCG.cginc" (這也是為啥我前面強行帶節(jié)奏的原因)

然后來普及下Unity為我們內(nèi)置了哪些東西吧:


Transformations 變換float4x4 UNITY_MATRIX_MVPCurrent model*view*projection matrix 當(dāng)前物體*視*投影矩陣。(注:物體矩陣為 本地->世界)float4x4 UNITY_MATRIX_MVCurrent model*view matrix 當(dāng)前物體*視矩陣float4x4 UNITY_MATRIX_PCurrent projection matrix 當(dāng)前物體*投影矩陣float4x4 UNITY_MATRIX_T_MVTranspose of model*view matrix 轉(zhuǎn)置物體*視矩陣float4x4 UNITY_MATRIX_IT_MV Inverse transpose of model*view matrix 逆轉(zhuǎn)置物體*視矩陣float4x4 UNITY_MATRIX_TEXTURE0 to UNITY_MATRIX_TEXTURE3Texture transformation matrices 貼圖變換矩陣float4x4 _Object2WorldCurrent model matrix 當(dāng)前物體矩陣float4x4 _World2ObjectInverse of current world matrix 物體矩陣的逆矩陣float3 _WorldSpaceCameraPosWorld space position of the camera 世界坐標(biāo)空間中的攝像機位置float4 unity_Scalexyz components unused; .w contains scale for uniformly scaled objects. 不適用xyz分量,而是通過w分量包含的縮放值等比縮放物體。_ModelLightColor    float4  Material's Main * Light color 材質(zhì)的主顏色*燈光顏色_SpecularLightColor float4  Material's Specular * Light color 材質(zhì)的鏡面反射(高光)*燈光顏色。_ObjectSpaceLightPos    float4  Light's position in object space. w component is 0 for directional lights, 1 for other lights 物體空間中的燈光為,平行光w分量為零其燈光為1;_Light2World    float4x4    Light to World space matrix 燈光轉(zhuǎn)世界空間矩陣_World2Light    float4x4    World to Light space matrix 世界轉(zhuǎn)燈光空間矩陣_Object2Light   float4x4    Object to Light space matrix 物體轉(zhuǎn)燈光空間矩陣float4 _Time : Time (t/20, t, t*2, t*3), use to animate things inside the shaders 時間: 用于Shasder中可動畫的地方。float4 _SinTime : Sine of time: (t/8, t/4, t/2, t) 時間的正弦值。float4 _CosTime : Cosine of time: (t/8, t/4, t/2, t) 時間的余弦值float4 _ProjectionParams : 投影參數(shù)x is 1.0 or -1.0, negative if currently rendering with a flipped projection matrix x為1.0 或者-1.0如果當(dāng)前渲染使用的是一個反轉(zhuǎn)的投影矩陣那么為負。 y is camera's near plane y是攝像機的近剪裁平面z is camera's far plane z是攝像機遠剪裁平面w is 1/FarPlane. w是1/遠剪裁平面float4 _ScreenParams : 屏幕參數(shù)x is current render target width in pixels x是當(dāng)前渲染目標(biāo)在像素值中寬度y is current render target height in pixels y是當(dāng)前渲染目標(biāo)在像素值中的高度z is 1.0 + 1.0/width z是1.0+1.0/寬度w is 1.0 + 1.0/height w是1.0+1.0/高度

呃,格式不是很好看的樣子,這里有鏈接,自己去看吧http://www.ceeger.com/Components/SL-BuiltinValues.html

有了這些東西之后呢,我們就可以簡單的根據(jù)時間變化做一些動態(tài)shader了,比如什么UV流動啊,顏色動態(tài)變化啊,動態(tài)模型(是動態(tài)模型不是模型動畫哈)啥的,瞬間就高大上了有不有,性能嘛取決于你寫的代碼(同樣的代碼級別下,shader速度秒殺你在c#中寫)


總結(jié)


這一篇感覺寫的比較亂,主要是知識點比較雜(這理由不是很好找啊....原諒我語文老師是數(shù)學(xué)老師教大的)

主要知識點是介紹一下光柵化那個插值,這個很重要https://en.wikibooks.org/wiki/Cg_Programming/Rasterization(雖然我講的一筆帶過,大家去看看官方解釋吧)

然后介紹一下UnityCG.cginc,我們既然是寫的unityshader,當(dāng)然還是要經(jīng)常使用這個庫的啦,后面還有光照,空間矩陣啥的,基本我們要想做高級特效離不開這個庫的,大家可以去看看這個庫源碼

了解了這些之后,就是單純的算法了(比如怎么通過時間更改模型頂點位置實現(xiàn)好看的動畫啥的)

恩~~~再次坦白下寫的比較亂,如有疑問歡迎聯(lián)系QQ:821580467一起探討


本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Unity Shader內(nèi)置appdata結(jié)構(gòu)
初入shader的教程第一課 想了解shader來看看吧 | Imagination中文技術(shù)社區(qū)
URP | 粒子系統(tǒng)Custom自定義數(shù)據(jù)控制溶解
Unity3D Shader 使指定顏色過濾成透明
RenderDoc[03] 還原粒子特效shader
高級著色語言HLSL入門(1)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服