public LruCache(int maxMip, int physicalSizeX, int physicalSizeY, PhysicalTexture physical, PageTable table) { m_MipEnd = new LinkedListNode <int> [maxMip + 1]; m_NumMip = new int[maxMip + 1]; for (int i = 0; i < maxMip + 1; i++) { m_NumMip[i] = 0; } m_PhysicalSize = new Vector2Int(physicalSizeX, physicalSizeY); m_IdToMip = new int[physicalSizeX * physicalSizeY]; for (int i = 0; i < physicalSizeX * physicalSizeY; i++) { Add(i); } //将mip 0 list的结尾放到list 的最后,其他mip list 结尾暂时为null m_MipEnd[0] = m_List.Last; physicalTexture = physical; pageTable = table; }
void Start() { TilesToGenerate = new List <int>(); TileGeneratorMat = new Material(TileGenerator); TileGeneratorMat.SetShaderPassEnabled("Always", false); LayerCount = DemoTerrain.terrainData.terrainLayers.Length; physicalTexture = (PhysicalTexture)GetComponent(typeof(PhysicalTexture)); pageTable = (PageTable)GetComponent(typeof(PageTable)); m_TilePool = new LruCache(pageTable.MaxMipLevel, physicalTexture.PhysicalTextureSize.x, physicalTexture.PhysicalTextureSize.y, physicalTexture, pageTable); //TODO 更好的texture存储方式?? TileGeneratorMat.SetTexture("_AlphaMap", DemoTerrain.terrainData.alphamapTextures[0]); Vector4[] tileInfo = new Vector4[4]; for (int i = 0; i < LayerCount && i < 4; i++) { TerrainLayer currLayer = DemoTerrain.terrainData.terrainLayers[i]; currLayer.diffuseTexture.wrapMode = TextureWrapMode.Repeat; currLayer.normalMapTexture.wrapMode = TextureWrapMode.Repeat; currLayer.diffuseTexture.filterMode = FilterMode.Bilinear; currLayer.normalMapTexture.filterMode = FilterMode.Bilinear; TileGeneratorMat.SetTexture("_Diffuse" + i, currLayer.diffuseTexture); TileGeneratorMat.SetTexture("_Normal" + i, currLayer.normalMapTexture); tileInfo[i].x = currLayer.tileSize.x; tileInfo[i].y = currLayer.tileSize.y; tileInfo[i].w = currLayer.tileOffset.x; tileInfo[i].z = currLayer.tileOffset.y; } TileGeneratorMat.SetVector("_TerrainSize", DemoTerrain.terrainData.size); TileGeneratorMat.SetVectorArray("_TileInfo", tileInfo); }