<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Unity3D學習筆記10——紋理數組

      1. 概述

      個人認為,紋理數組是一個非常有用的圖形特性。紋理本質上是一個二維的圖形數據;通過紋理數組,給圖形數據再加上了一個維度。這無疑會帶來一個巨大的性能提升:一次性傳輸大量的數據總是比分批次傳輸數據要快。

      2. 詳論

      2.1. 實現

      創建一個GameObject對象,并且加入Mesh Filter組件和Mesh Renderer組件。Mesh Filter我們可以設置Mesh為Quad,同時在Mesh Filter上掛一個我們新建的材質:

      imglink1

      在這個GameObject對象上掛接一個我們創建的C#腳本:

      using Unity.Collections;
      using UnityEngine;
      
      [ExecuteInEditMode]
      public class Note10Main : MonoBehaviour
      {
          public Texture2D texture1;
          public Texture2D texture2;
      
          [Range(0.0f, 1.0f)]
          public float weight;
      
          Material material;
      
          // Start is called before the first frame update
          void Start()
          { 
              MeshRenderer mr = GetComponent<MeshRenderer>();
              material = mr.sharedMaterial;
      
              Texture2DArray texture2DArray = CreateTexture2DArray();
      
              material.mainTexture = texture2DArray;
              material.SetFloat("_Weight", weight);
          }
      
          Texture2DArray CreateTexture2DArray()
          {
              Texture2DArray texture2DArray = new Texture2DArray(texture1.width, texture1.height, 2,
                  texture1.format, false);
      
              NativeArray<byte> pixelData1 = texture1.GetPixelData<byte>(0);
              NativeArray<byte> pixelData2 = texture2.GetPixelData<byte>(0);
                      
              texture2DArray.SetPixelData(pixelData1, 0, 0, 0);
              texture2DArray.SetPixelData(pixelData2, 0, 1, 0);
      
              texture2DArray.Apply(false, false);
      
              return texture2DArray;
          }
      
          // Update is called once per frame
          void Update()
          {
              material.SetFloat("_Weight", weight);
          }
      }
      

      這段C#腳本的意思是,通過傳入兩個Texture2d,生成一個texture2DArray;并且,將這個texture2DArray傳入到材質中。需要注意的是紋理數組中的每個紋理的參數如寬、高等參數都需要一致,否則不能組成紋理數組。

      材質使用我們自定義的Shader:

      Shader "Custom/TextureArrayShader"
      {
          Properties
          {
      		_MainTex ("Texture", 2DArray) = "" {}
      		_Weight ("Weight", float) = 0.0 
          }
          SubShader
          {
              Tags { "RenderType"="Opaque" }
              LOD 100
      
              Pass
              {
                  CGPROGRAM
                  #pragma vertex vert
                  #pragma fragment frag
        
                  #include "UnityCG.cginc"
      
                  struct appdata
                  {
                      float4 vertex : POSITION;
                      float2 uv : TEXCOORD0;
                  };
      
                  struct v2f
                  {
                      float2 uv : TEXCOORD0;       
                      float4 vertex : SV_POSITION;
                  };
      
                  UNITY_DECLARE_TEX2DARRAY(_MainTex);
      			float _Weight;
      
                  v2f vert (appdata v)
                  {
                      v2f o;
                      o.vertex = UnityObjectToClipPos(v.vertex);
                      o.uv = v.uv;          
                      return o;
                  }
      
                  fixed4 frag (v2f i) : SV_Target
                  {           
      				fixed4 col0 = UNITY_SAMPLE_TEX2DARRAY(_MainTex, float3(i.uv, 0));
      				fixed4 col1 = UNITY_SAMPLE_TEX2DARRAY(_MainTex, float3(i.uv, 1));		
                      return lerp(col0, col1, _Weight);
                  }
                  ENDCG
              }
          }
      }
      

      這里實現的效果是,將紋理數組中的兩個紋理根據權重進行混合。權重值也是在C#腳本中傳入到Shader中的。在編輯器中將權重調整到中間一點的位置(例如0.5):
      imglink2

      Shader代碼也很好理解,關鍵在于紋理數組相關的宏,其實是對hlsl或者glsl的封裝:

      #define UNITY_DECLARE_TEX2DARRAY(tex) Texture2DArray tex; SamplerState sampler##tex
      #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) tex.Sample (sampler##tex,coord)
      
      #define UNITY_DECLARE_TEX2DARRAY(tex) sampler2DArray tex
      #define UNITY_SAMPLE_TEX2DARRAY(tex,coord) tex2DArray (tex,coord)
      

      2.2. 注意

      1. 關于紋理數組的創建,也可以使用Graphics.CopyTexture()這個接口。這個接口是純走GPU端的,效率應該回更高。
      2. 紋理數組這個特性在低端顯卡上可能不支持,但是不一定就會非常耗費性能。可以考慮通過紋理數組的方式來合并渲染的批次。
      3. 紋理數組個數的限制并不是紋理單元個數。實際上一個紋理數組只會綁定到一個紋理單元上,而在本人GTX 1660 Ti的顯卡上,紋理數組個數的限制是4096個。

      3. 參考

      1. Texture2DArray 功能測試
      2. What are the limits of texture array size?

      代碼地址

      posted @ 2022-07-27 12:52  charlee44  閱讀(1223)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲AVAV天堂AV在线网阿V| 人妻中文字幕精品系列| 国产精品成人久久电影| 日韩乱码人妻无码中文字幕视频| 无套内谢少妇毛片在线| 天干天干夜啦天干天干国产| 成人欧美一区二区三区在线观看| 国产中年熟女高潮大集合| 一区二区丝袜美腿视频| 四房播色综合久久婷婷| 老熟妇高潮一区二区三区| 成人精品日韩专区在线观看 | 久久久久四虎精品免费入口| 色视频在线观看免费视频| 成人免费A级毛片无码片2022| 亚洲国产成人av毛片大全| 国产精品色悠悠在线观看| 中文字幕国产精品综合| 蜜臀av久久国产午夜| 国产久爱免费精品视频| 18禁国产一区二区三区| 国产亚洲av手机在线观看| 日韩av第一页在线播放| jizz视频在线观看| 青青国产揄拍视频| 永久免费AV无码国产网站| 色综合一本到久久亚洲91| 国产综合久久久久鬼色| 激情啪啪啪一区二区三区| 亚洲va久久久噜噜噜久久狠狠 | 免费无码又爽又刺激高潮虎虎视频| 国产偷窥熟女高潮精品视频| 东京热tokyo综合久久精品| 久久久精品人妻一区二区三区| 2020国产成人精品视频| 99久久亚洲综合精品成人网| 亚洲国产成人资源在线| 欧美xxxxhd高清| 深夜福利资源在线观看| 97夜夜澡人人爽人人模人人喊| 国产裸体美女视频全黄|