forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Слияние текстур XNA (Texture2D) (http://forum.boolean.name/showthread.php?t=14446)

ІГРОГРАЙКО 19.03.2011 20:41

Слияние текстур XNA (Texture2D)
 
Допустим у меня есть 4 текстуры разрешением 128 х 4096:

Код:

for(int i = 0; i < 4; i++)
{
        mTextureNX[i] = new Texture2D(Game.GraphicsDevice, 128, 4096);
}

Как сделать из етих одну с разрешением 512 х 4096 ?

Dream 26.03.2011 21:23

Ответ: Слияние текстур XNA (Texture2D)
 
отрендерить все текстуру в одну.
создать RenderTarget2D, установить его на график девайс в качесте текущего таргета и отрисовать текстуры в нужных координатах и вуаля, у тебя ьбудет текстура - тот самый рендер таргет.
Вот пример на XNA 4.0
Код:

public Texture2D RenderInOneTexture(Texture2D[] textures)
        {
        //расчитаем еужный размер конечной текстуры
            int allSize = 0;
            int maxW = 0;
            for (int i = 0; i < textures.Length; i++)
            {
                allSize += textures[i].Height;
                if(textures[i].Width>maxW)
                {
                    maxW = textures[i].Width;
                }
            }
            //создаём текстуру, куда будем рендерить( в XNA 3.1-3.0 нужно будет вернуть
            //у таргета имеено текстуру, так как в XNA 4 сделали RenderTarget наследником Texture2D)
            RenderTarget2D resultTexture=new RenderTarget2D(GraphicsDevice,maxW,allSize);
            GraphicsDevice.SetRenderTarget(resultTexture);
            spriteBatch.Begin(SpriteSortMode.Immediate,BlendState.AlphaBlend);
            allSize = 0;
            for (int i = 0; i < textures.Length; i++)
            {
              spriteBatch.Draw(textures[i],new Vector2(0,allSize),Color.White);
                allSize += textures[i].Height;
            }
            spriteBatch.End();
            GraphicsDevice.SetRenderTarget(null);
            return resultTexture;
        }


pax 26.03.2011 22:08

Ответ: Слияние текстур XNA (Texture2D)
 
А с пикселями текстур нельзя работать? Рендеринг - это искажение.

ІГРОГРАЙКО 26.03.2011 23:22

Ответ: Слияние текстур XNA (Texture2D)
 
Спасибо Dream за предоставленый вариант!:super:
Я забыл что в класе Texture2D метода SetData:
Код:

public void SetData<T> (
        T[] data,
        int startIndex,
        int elementCount,
        SetDataOptions options
) where T : ValueType

Есть еще одна перегрузка:
Код:

public void SetData<T> (
        int level,
        Nullable<Rectangle> rect,
        T[] data,
        int startIndex,
        int elementCount,
        SetDataOptions options
) where T : ValueType

Которая позволяет заливать цветную дату целыми блоками с помощю Rectangle... И при етом с следующими итерацыями цикла не вилетает ошибка о недостаточном заполнении области текстури InvalidOperationException The size of the data passed in is too large or too small for this resource. :super:

Dream 27.03.2011 00:14

Ответ: Слияние текстур XNA (Texture2D)
 
Цитата:

Сообщение от pax (Сообщение 183840)
А с пикселями текстур нельзя работать? Рендеринг - это искажение.

Какое такое искажение? Не замечал чтото.


По поводу SetData разве она будет быстрее чем рендеринг? очень сомневаюсь

pax 27.03.2011 00:49

Ответ: Слияние текстур XNA (Texture2D)
 
Цитата:

Сообщение от Dream (Сообщение 183855)
Какое такое искажение? Не замечал чтото.

Прежде чем попасть в цель визуализации спрайт пройдет через GPU, проинтерполирует цвета на текстуре и выведет их. Обычно чтобы попасть точно пиксель в пиксель в шейдерах делают пиксельную коррекцию. Не думаю что такая есть в дефолтном шейдере, который выводит спрайты в XNA.

Dream 27.03.2011 00:50

Ответ: Слияние текстур XNA (Texture2D)
 
я гарантирую что пнг-jpg текстуры не размазываются если не делать смещения на дробное число.

pax 27.03.2011 00:54

Ответ: Слияние текстур XNA (Texture2D)
 
Цитата:

Сообщение от Dream (Сообщение 183860)
я гарантирую что пнг-jpg текстуры не размазываются если не делать смещения на нечётное число.

:) float сам по себе не точный, но в данном случае может и не будет искажений.


Часовой пояс GMT +4, время: 02:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot