Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

кубическая картаНабор из шести квадратных текстур, которые могут представлять отражения в окружающей среде или скайбокс, нарисованный позади вашей геометрии. Шесть квадратов образуют грани воображаемого куба, окружающего объект; каждая грань представляет вид по направлениям мировых осей (вверх, вниз, влево, вправо, вперед и назад). Подробнее
См. в массиве Словарь
 — это массив кубических карт, того же размера и формата, и к которым GPU может получить доступ как к единому текстурному ресурсу. Массивы кубических карт часто используются для реализации эффективного зонда отражениякомпонента рендеринга, который захватывает сферический вид своего окружения во всех направлениях, как камера. Захваченное изображение затем сохраняется как кубическая карта, которую можно использовать для объектов с отражающими материалами. Подробнее
См. в Словарь
, системы освещения и затенения.

В вашем проекте Unity редактор Unity представляет массивы кубических карт как ресурсы текстуры. Чтобы настроить параметры импорта объекта текстуры, вы можете использовать ИнспекторОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать значения. Подробнее
См. в Словарь
или напишите скрипт, использующий TextureImporter API. В движке Unity Unity использует класс CubemapArray для представления массивов кубических карт.

Создание массива кубической карты

Чтобы создать массив кубической карты в проекте, необходимо использовать скрипт.

Следующий пример представляет собой сценарий редактора, который создает экземпляр класса CubemapArray, заполняет его данными о цвете, а затем сохраняет его в вашем проекте как объект текстуры.

using UnityEngine; public class CreateCubeArrayTexture : MonoBehaviour { [UnityEditor.MenuItem("CreateExamples/CubemapArray")] static void CreateCubemapArray() { // Configure the cubemap array and color data int faceSize = 16; int arraySize = 4; int[] kCubeXRemap = new int[] { 2, 2, 0, 0, 0, 0 }; int[] kCubeYRemap = new int[] { 1, 1, 2, 2, 1, 1 }; int[] kCubeZRemap = new int[] { 0, 0, 1, 1, 2, 2 }; float[] kCubeXSign = new float[] { -1.0F, 1.0F, 1.0F, 1.0F, 1.0F, -1.0F }; float[] kCubeYSign = new float[] { -1.0F, -1.0F, 1.0F, -1.0F, -1.0F, -1.0F }; float[] kCubeZSign = new float[] { 1.0F, -1.0F, 1.0F, -1.0F, 1.0F, -1.0F }; var baseCols = new Color[] { Color.white, new Color(1, .5f, .5f, 1), new Color(.5f, 1, .5f, 1), new Color(.5f, .5f, 1, 1), Color.gray }; // Create an instance of CubemapArray var tex = new CubemapArray(faceSize, arraySize, TextureFormat.ARGB32, true); tex.filterMode = FilterMode.Trilinear; // Iterate over each cubemap var col = new Color[tex.width * tex.width]; float invSize = 1.0f / tex.width; for (var i = 0; i < tex.cubemapCount; ++i) { var baseCol = baseCols[i % baseCols.Length]; // Iterate over each face of the current cubemap for (var face = 0; face < 6; ++face) { var idx = 0; Vector3 signScale = new Vector3(kCubeXSign[face], kCubeYSign[face], kCubeZSign[face]); // Iterate over each pixel of the current face for (int y = 0; y < tex.width; ++y) { for (int x = 0; x < tex.width; ++x) { // Calculate a "normal direction" color for the current pixel Vector3 uvDir = new Vector3(x * invSize * 2.0f - 1.0f, y * invSize * 2.0f - 1.0f, 1.0f); uvDir = uvDir.normalized; uvDir.Scale(signScale); Vector3 dir = Vector3.zero; dir[kCubeXRemap[face]] = uvDir[0]; dir[kCubeYRemap[face]] = uvDir[1]; dir[kCubeZRemap[face]] = uvDir[2]; // Shift the color into the 0.4..1.0 range Color c = new Color(dir.x * 0.3f + 0.7f, dir.y * 0.3f + 0.7f, dir.z * 0.3f + 0.7f, 1.0f); // Add a pattern to some pixels, so that mipmaps are more clearly visible if (((x ^ y) & 3) == 1) c *= 0.5f; // Tint the color with the baseCol tint col[idx] = baseCol * c; ++idx; } } // Copy the color values for this face to the texture tex.SetPixels(col, (CubemapFace)face, i); } } // Apply the changes to the texture and upload the updated texture to the GPU tex.Apply(); // Save the texture to your Unity Project AssetDatabase.CreateAsset(tex, "Assets/ExampleCubemapArray.asset"); UnityEditor.AssetDatabase.SaveAssets(); } }

Предварительный просмотр массива кубической карты

Чтобы просмотреть массив кубической карты в окне Инспектора, перейдите в окно проектаокно, в котором отображается содержимое вашего Папка Assets (вкладка Project) Дополнительная информация
См. Словарь
и выберите объект текстуры. Настройки импорта текстуры для этого объекта текстуры теперь видны в Инспекторе, а Unity отрисовывает предварительный просмотр массива кубической карты в нижней части Инспектора.

Следующие элементы управления доступны на панели инструментовряд кнопок и основных элементов управления в верхней части редактора Unity, который позволяет вам взаимодействовать с редактором различными способами (например, масштабирование, перевод). Подробнее
См. в Словарь
:

Контроль Функции
Filter Mode Фильтрация для предварительного просмотра. См. документацию по Режиму фильтрации.

Использование массива кубической карты в шейдере

Вот пример шейдерапрограммы, работающей на графическом процессоре. Подробнее
См. Словарь
, в котором используется массив кубической карты.

Shader "CubemapArrayShaderExample" { Properties { _MainTex ("CubemapArray", CubeArray) = "" {} _Mip ("Mip", Float) = 0.0 _Intensity ("Intensity", Float) = 1.0 _SliceIndex ("Slice", Int) = 0 _Exposure ("Exposure", Float) = 0.0 } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "ForceSupported" = "True"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma require sampleLOD #pragma require cubearray #include "UnityCG.cginc" struct appdata { float4 pos : POSITION; float3 nor : NORMAL; }; struct v2f { float3 uv : TEXCOORD0; float4 pos : SV_POSITION; }; uniform int _SliceIndex; float _Mip; half _Alpha; half _Intensity; float _Exposure; v2f vert (appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.pos); float3 viewDir = -normalize(ObjSpaceViewDir(v.pos)); o.uv = reflect(viewDir, v.nor); return o; } half4 _MainTex_HDR; UNITY_DECLARE_TEXCUBEARRAY(_MainTex); fixed4 frag (v2f i) : COLOR0 { fixed4 c = UNITY_SAMPLE_TEXCUBEARRAY(_MainTex, float4(i.uv, _SliceIndex)); fixed4 cmip = UNITY_SAMPLE_TEXCUBEARRAY_LOD(_MainTex, float4(i.uv, _SliceIndex), _Mip); if (_Mip >= 0.0) c = cmip; c.rgb = DecodeHDR (c, _MainTex_HDR) * _Intensity; c.rgb *= exp2(_Exposure); c = lerp (c, c.aaaa, _Alpha); return c; } ENDCG } } Fallback Off }

Если вы используете этот шейдер с массивом Cubemap, созданным в примере вверху страницы, результат будет выглядеть следующим образом:


[Cubemap array support] добавлен в 2020.1

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3