Объединить несколько небольших текстур в большую текстуру - PullRequest
0 голосов
/ 05 сентября 2011

Извините за это, может быть, это очень простой вопрос, у меня есть несколько небольших текстур с разными размерами и координатами, и я хочу применить некоторый переход к этому. Поэтому мне нужно объединить все эти текстуры в одну большую текстуру, чтобы получить единую текстуру размером с экран.

Ответы [ 3 ]

1 голос
/ 05 сентября 2011

То, что вы ищете, называется Атлас текстуры

В компьютерной графике в реальном времени текстурный атлас представляет собой большое изображение, или «атлас», который содержит множество меньших подизображений, каждое из которых является текстурой для некоторой части трехмерного объекта

Поиск Google даст вам сводку и инструменты для их создания.

0 голосов
/ 30 сентября 2018

Измените это для вашей задачи:

    /// <summary>
    /// Line up the textures in list horizontally. Warning: All textures MUST BE one height and in strong order
    /// </summary>
    /// <param name="device">D3D device</param>
    /// <param name="textures">List of textures</param>
    /// <returns>Combined texture</returns>
    public static Texture LineUpTexturesHorizontally ( Device device, List < Texture > textures )
    {
        int dstWidth = textures.Select ( texture => texture.GetSurfaceLevel ( 0 ) ).Select ( surface => surface.Description.Width ).Sum ( );
        int dstHeight = textures [ 0 ].GetSurfaceLevel ( 0 ).Description.Height;
        Texture dstTexture = CreateTexture ( device, dstWidth, dstHeight, Color.Orange, TexMipLevels, true );
        Surface dstSurface = dstTexture.GetSurfaceLevel ( 0 );
        Point insPoint = new Point ( 0, 0 );
        for ( int i = 0; i < textures.Count; i++ )
        {
            PaletteEntry [ ] pal; // = new PaletteEntry[ 256 ];
            Texture srcTexture = textures [ i ];
            Surface srcSurface = srcTexture.GetSurfaceLevel ( 0 );
            int srcWidth = srcSurface.Description.Width;
            int srcHeight = srcSurface.Description.Height;
            Rectangle srcRectangle = new Rectangle ( 0, 0, srcWidth, srcHeight );
            Rectangle dstRectangle = new Rectangle ( insPoint, new Size ( srcWidth, srcHeight ) );
            SurfaceLoader.FromSurface ( dstSurface, out pal, dstRectangle, srcSurface, out pal, srcRectangle, Filter.None, 0 );
            insPoint.X += srcWidth;
        }
        return dstTexture;
    }
0 голосов
/ 05 сентября 2011

Я бы сказал, если вам не нужно делать это в реальном времени (т.е. исходные текстуры не меняются), тогда просто сделайте это в вашем любимом графическом редакторе (например, mspaint!).


Если вы хотите сделать это в игре, тогда посмотрите на этот вопрос: Визуализация буфера для объекта texture2D в XNA

...