Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 19.03.2011, 20:41   #1
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Слияние текстур XNA (Texture2D)

Допустим у меня есть 4 текстуры разрешением 128 х 4096:

for(int i = 0; i < 4; i++)
{
         mTextureNX[i] = new Texture2D(Game.GraphicsDevice, 128, 4096);
}
Как сделать из етих одну с разрешением 512 х 4096 ?
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием
Старый 26.03.2011, 21:23   #2
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Слияние текстур 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;
        }
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ІГРОГРАЙКО (26.03.2011)
Старый 26.03.2011, 22:08   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Слияние текстур XNA (Texture2D)

А с пикселями текстур нельзя работать? Рендеринг - это искажение.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ІГРОГРАЙКО (26.03.2011)
Старый 26.03.2011, 23:22   #4
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Ответ: Слияние текстур XNA (Texture2D)

Спасибо Dream за предоставленый вариант!
Я забыл что в класе 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.
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием
Старый 27.03.2011, 00:14   #5
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Слияние текстур XNA (Texture2D)

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


По поводу SetData разве она будет быстрее чем рендеринг? очень сомневаюсь
(Offline)
 
Ответить с цитированием
Старый 27.03.2011, 00:49   #6
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Слияние текстур XNA (Texture2D)

Сообщение от Dream Посмотреть сообщение
Какое такое искажение? Не замечал чтото.
Прежде чем попасть в цель визуализации спрайт пройдет через GPU, проинтерполирует цвета на текстуре и выведет их. Обычно чтобы попасть точно пиксель в пиксель в шейдерах делают пиксельную коррекцию. Не думаю что такая есть в дефолтном шейдере, который выводит спрайты в XNA.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Dream (27.03.2011)
Старый 27.03.2011, 00:50   #7
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Слияние текстур XNA (Texture2D)

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

Последний раз редактировалось Dream, 29.03.2011 в 20:02.
(Offline)
 
Ответить с цитированием
Старый 27.03.2011, 00:54   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Слияние текстур XNA (Texture2D)

Сообщение от Dream Посмотреть сообщение
я гарантирую что пнг-jpg текстуры не размазываются если не делать смещения на нечётное число.
float сам по себе не точный, но в данном случае может и не будет искажений.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com