1. 程式人生 > >【貓貓的Unity Shader之旅】之紋理對映

【貓貓的Unity Shader之旅】之紋理對映

紋理對映原理

  紋理對映通俗點講就是把紋理貼圖“覆蓋”到物體表面。紋理座標用來表示網格上的頂點與紋理上的座標的對應關係,用一組二元數表示,分別稱作S和T,或者x和y,或者U和V,說的都是它們啦。這感覺就像把一個氣球一樣材質的圖片覆蓋到物體上,並且這種材質上任何幾個點都可以任意拉伸或者壓縮,不用擔心會破,可以想象一下這種感覺。

獲得紋理座標

  模型可以提供紋理座標,我們只需要將座標從頂點函式傳到片段函式就可以了。不過有一點需要注意,我們可以先看一下Unity提供的紋理的介面,如圖:

  這裡寫圖片描述

  可以看到介面上有兩個二元數Tiling和Offset,其中Tiling表示UV的縮放,Offset表示偏移。對於紋理座標的兩個分量x和y,都會先乘以Tiling然後加上Offset。不過要實現這樣的效果,需要在Shader中做一些處理。

  首先是為取樣圖XX定義一個名為一個XX_ST的四元數,比如為_MainTex定義_MainTex_ST。另外需要對模型的uv座標經過TRANSFORM_TEX進行處理。

實現紋理對映

  我們來實現個最簡單的紋理對映:

Shader "Custom/TextureMapping" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform float4 _MainTex_ST; struct v2f { float2 uv : TEXCOORD; float4 pos : SV_POSITION; }; v2f vert(appdata_base IN
) { v2f o; o.uv = TRANSFORM_TEX(IN.texcoord, _MainTex); o.pos = mul(UNITY_MATRIX_MVP, IN.vertex); return o; } float4 frag(v2f v) : COLOR { return tex2D(_MainTex, v.uv); } ENDCG } } FallBack "Diffuse" }

  效果如圖:

  這裡寫圖片描述

  可以試著調一下Tiling和Offset,效果如下:

  這裡寫圖片描述

  可以發現貓貓變多了也移動了一點(x方向,需要仔細看)。

結束語

  紋理對映這塊相對比較簡單,主要是有封裝好的tex2D這樣方法用。紋理使渲染過程中非常重要的元素,但是過多的紋理意味著過多的取樣,也會造成不小的效能開銷。