日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity 基础纹理

發布時間:2023/11/30 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity 基础纹理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第七章 基礎紋理

導言

在OpenGL里,紋理空間的原點位于左下角,而在DirectX中,原點位于左上角。Unity中使用的紋理空間是符合OpenGL的傳統的,位于紋理左下角。

一、單張紋理

通常使用一張紋理來代替物體的漫反射顏色。

紋理導入面板

  • Filter Mode ,代表紋理拉伸時的濾波模式,支持3種模式: Point、Bilinear、Trilinear;效果依次增加。
  • 紋理縮小時,多個像素將會對應一個目標像素。我們往往需要處理抗鋸齒問題。一個最常用的方法是使用多級漸遠紋理(mipmapping)技術。即提前用了濾波處理得到了更多更小的圖像,儲存起來。運行時,可以直接使用。通常需要多占用33%的空間。
    • Point:使用最近鄰濾波,在放大或縮小時,采樣像素數目通常只有一個,一次圖像看起來有種像素風格。
    • Bilinear:使用線性濾波,對于每個目標像素,它會找到4個近鄰像素,然后對它們進行線性插值混合后得到的最終像素,因此圖像看起來被模糊了。
    • Trilinear:除了Bilinear所做的工作之外,還會在多級漸遠紋理之間進行混合。
  • 紋理的最大尺寸:unity允許不同平臺發布游戲時,選擇不同的分辨率。如果導入的紋理大小超過了Max Texture Size中的設置值,那么unity將會把該紋理縮放為這個最大分辨率。理想情況下,導入的紋理可以是非正方形的,但長寬的大小應該是2的冪。這樣unity內部才能進行壓縮,而且GPU讀取該紋理的速度更快。

二、凹凸映射

兩種凹凸映射做法

  • 高度映射:使用一張高度紋理來模擬表面位移,然后得到一個修改后的法線值。優點是直觀,缺點是消耗運行時性能。高度紋理更多用來存儲地形信息。高度圖中存儲的是強度值,表示模型表面局部的海拔高度。

  • 法線映射:直接存儲表面法線信息,由于法線方向的分量范圍在[-1, 1],而像素的分量范圍是[0,1],因此我們需要做一個映射,通常使用的映射就是。所以我們從法線紋理進行采樣后,需要進行一次反映。
    pixel=normal+12pixel = \frac{normal + 1}{2} pixel=2normal+1?

  • 模型空間法線紋理 VS 切線空間法線紋理:

  • 模型空間優點:
  • 實現簡單,直觀;
  • 在紋理坐標的縫合處和尖銳的邊角部分,可見的突變較少;
  • 切線空間的優點:
  • 紋理可復用;
  • 可進行UV動畫;
  • 可壓縮;
  • Unity中的法線紋理類型

  • Unity可以把法線紋理標識成Normal map類型,此時可以使用shader中內置的UnpackNormal函數,來得到正確的法線方向。

  • 當我們把紋理類型設置為Normal map,可以讓Unity根據不同平臺對紋理進行壓縮(DXT5nm)。原理就是發現紋理只有兩個通道是真正具有信息的,第三個通道的值可以用另外兩個推導出來(法線是單位向量,切線空間下的法線方向的Z分量為正)。

  • 三、 漸變紋理

    使用漸變紋理來控制漫反射光照的結果。

    • 書本這里使用半蘭伯特模型,計算UV坐標。書里沒有明說這么做的理由是什么,這里部分是我自己思考的。我們的目的是得到顏色分層的結果。觀察漸變紋理,我們發現色帶前面的對應陰影部分,后面對應光照強烈的部分。所以每個片元收到的光照越強,就應該對應色帶值大的分。正好半蘭伯特模型也是這樣,受到的光照越強,得到的值越大。就這樣應用過來了。
    • 注意:漸變紋理的Weap Mode需要設置為Clamp模型,防止紋理采樣時由于浮點數精度造成問題。

    四、遮罩紋理

    遮罩紋理,字面翻譯就是通過遮罩保護某些區域,使它免于某些修改。比如書中例子的高光遮罩紋理,在紋理RGBA的R分量里儲存了mask值。在shader中通過下面的語句使用。采樣了遮罩紋理,然后將值乘在原高光分量上。用來控制高光的強度。

    // Get the mask value fixed specularMask = tex2D(_SpecularMask, i.uv).r * _SpecularScale; // Compute specular term with the specular mask fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(tangentNormal, halfDir)), _Gloss) * specularMask;
    • 其實看到這里我們已經發現了,我們想逐像素的控制表面屬性。就把對應像素的參數都填充在一個紋理里,在shader中參與計算就行了。通常,我們可以充分利用一張紋理的RGBA四個通道,用于儲存不同的表面屬性參數。

    引用

    • 如何創建法線貼圖

    • Unity Shader入門精要 閱讀筆記十

    總結

    以上是生活随笔為你收集整理的Unity 基础纹理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。