c# imager让图片有圆角unity_Unity纹理-引题和单张纹理
紋理映射腦洞一下,可以理解為,把一張圖貼在模型表面,去控制模型的顏色和外觀。本主題將記錄在unity中利用紋理采樣實現更加豐富的視覺效果。
通常美術人員會在建模軟件中利用紋理展開技術把紋理映射坐標(texture-mapping coordinates)存儲在每個頂點上。而紋理映射坐標定義了該頂點在紋理中對應的2D坐標,通常用一個二維變量(u,v)來表示,其中u是橫向坐標,v是縱向坐標,故紋理映射坐標又稱UV坐標。
紋理的大小可變(如256x256, 1028x1028),但頂點UV坐標通常歸一化到[0,1]范圍。特殊的情況是,紋理采樣時,坐標范圍不在[0,1]之內,會有特殊處理。
Unity使用的坐標系是符合OpenG傳統的,坐標原點位于紋理左下角。
單張紋理
- 運行平臺:Unity 2018.4.2f1 (64-bit)
- 項目地址:
Unity_Shader_GetIn
目標
使用單張紋理作為物體的漫反射顏色
實踐
在本例中仍使用Blinn-Phong光照模型。
準備工作:
Shader實現:
打開新建的SingleTexture,刪除所有已有代碼并寫入如下代碼:
Shader "Custom/SingleTexture" {Properties{_Specular("Specular Color", Color) = (1, 1, 1, 1)_Gloss("Gloss", Range(8.0, 256)) = 20//除了已有屬性之外,應添加一個名為_MainTex的紋理屬性,2D是紋理屬性的聲明方式,“white”是內置紋理的名字,意為全白_MainTex("Main Tex", 2D) = "white"{}//wei控制物體的整體色調,還可聲明_color屬性_Color("Color Tint", Color) = (1, 1, 1, 1)}SubShader{Pass {//LightMode標簽是Pass標簽的一種,它用于定義該Pass在Unity的光照流水線的顏色Tags{"LightMode" = "ForwardBase"}//CGPROGRAM和ENDCG共同包裹最重要的頂點著色器和片元著色器的代碼CGPROGRAM#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Color;sampler2D _MainTex;fixed4 _Specular;float _Gloss;//需要為紋理類型的屬性聲明一個float4類型的變量_MainTex_ST//p.s.:Unity中需要使用紋理名_ST的方式來聲明某個紋理的屬性。ST為縮放(scale)和平移(translation)的縮寫float4 _MainTex_ST;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;//用TEXCORD0將模型的第一組紋理坐標存儲到該變量中float4 texcoord : TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;//用uv存儲紋理坐標,以便在片元著色器中使用該紋理坐標進行紋理采樣float2 uv : TEXCOORD2;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_WorldToObject, v.vertex).xyz;//_MainTex_ST.xy存儲的是縮放值,_MainTex_ST.zw存儲的是偏移值,這些值可以在材質面板的紋理屬性中調節,分別作用于頂點紋理坐標上o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;return o;}//通過 scale/bias 屬性轉換2D UV,其中第一個參數是頂點紋理坐標,第二個是紋理名#define TRANSFORM_TEX(tex, name)(tex.xy * name##_ST.xy + name##_ST.zw)// 計算每個像素點的顏色值fixed4 frag(v2f i) : SV_Target {// 計算世界空間下的法線方向和光照方向fixed3 worldNormal = normalize(i.worldNormal); fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));//使用CG的tex2D函數對紋理進行采樣,第一個參數是需要被采樣的紋理,第二個參數是一個float2類型的紋理坐標,用于返回計算得到的紋素值//采樣結果* 顏色屬性_Color作為材質反射率albedofixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;// 環境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;//漫反射fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir)) ;// 視野方向fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 halfDir = normalize(worldLightDir + viewDir);//高光反射fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(worldNormal, halfDir), 0), _Gloss);// 最終顏色 = 漫反射 + 環境光 + 高光反射return fixed4(diffuse + ambient + specular, 1.0);}ENDCG}}FallBack "Specular" }在SingleTextureMat面板上可以使用資源Brick_Diffuse.jpg紋理(或其他圖片)對Main Tex屬性進行賦值
效果圖如下:
紋理的屬性
如圖所示為材質面板,接下來就其中幾個屬性進行聲明:
- 紋理類型(Texture Type):使用此選項可以從源圖像文件中選擇要創建的紋理的類型
- Default
- Normal Map
- Sprite (2D and UI)
…
本節使用Default類型,它是用于所有紋理的最常見設置。它提供對大多數屬性的訪問以進行紋理導入。另外,法線紋理通常使用Normal map類型將顏色通道轉換為適合實時法線貼圖的格式;在2D游戲中使用Sprite(2D和UI)。
- 紋理形狀(Texture Shape):使用它來選擇和定義紋理的形狀和結構。
- 2D
- Cube
…
本節使用2D類型,這是所有紋理的最常見設置。它將圖像文件定義為2D紋理。它提供對大多數屬性的訪問以進行紋理導入。另外,Cube將紋理定義為立方體(cubemap)。用戶可以將其用于“天空盒子(skybox)”或“ 反射探測器(Reflection Probes)”, 例如。選擇cube去顯示不同的映射選項。
- Alpha is Transparency:
如果指定的Alpha通道為透明度,則啟用Alpha為透明度可放大顏色并避免過濾邊緣上的瑕疵。
另提幾個重要的高級屬性:
- Wrap Mode: 決定了紋理坐標超過[0,1]時如何平鋪。 Repeat模式下紋理坐標超過了1,則其整數部分會被舍棄,而直接使用小數部分進行采樣。這樣使得紋理結果不斷重復;Clamp模式下,若紋理坐標大于1,則直接截取到1,若小于0,則截取到0。其他還有Mirror,Mirror Once等模式,不作詳述。
p.s.: 說起平鋪模式,則可以在材質面板中設置Tilling和Offset兩種屬性來調整紋理的重復次數和偏移位置
- Filter Mode:決定了紋理由于變換而產生拉伸時將采用哪種濾波模式
它支持3種:Point, BIlinear,Trilinear。得到圖片的濾波效果依次提升,需要耗費的性能也依次增大。紋理濾波會影響放大或縮小紋理時得到的圖片質量
p.s. Point濾波內部實現使用了最近鄰濾波,在放縮時采樣像素數目僅有一個,所以看上去有像素風效果(23333,好復古!)。Bilinear使用線性濾波,圖像看起來有模糊的效果,Trilinear與之大致相同,只不過混合時采用了多級漸遠紋理。
- 最大尺寸(Max Size) :導入的最大紋理尺寸(以像素為單位)。美工人員通常喜歡使用巨大的尺寸大小的紋理;使用最大尺寸將紋理縮小到合適的尺寸大小。值得一提的是,若導入紋理的長寬大小不是2的冪次則會占用更多內存,降低讀取速度。
- 紋理模式(Format) : 這將繞過自動系統來指定用于紋理的內部表示.使用的紋理格式精度越高(如,RGBA 32 bit),占用內存空間越大,但得到效果越好。因此需要具體需求具體分析。
參考
Unity_Shaders_Book : https://github.com/candycat1992/Unity_Shaders_Book
Unity Scripting Reference : https://docs.unity3d.com/ScriptReference/index.html
Unity Manual: https://docs.unity3d.com/Manual/TextureTypes.html
總結
以上是生活随笔為你收集整理的c# imager让图片有圆角unity_Unity纹理-引题和单张纹理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正则表达式加参数匹配
- 下一篇: java 发送数据_用JAVA模拟POS