|
С# Средство разработки на платформе .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
|
быдло
Регистрация: 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, 22:08
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Слияние текстур XNA (Texture2D)
А с пикселями текстур нельзя работать? Рендеринг - это искажение.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
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
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Слияние текстур XNA (Texture2D)
Сообщение от pax
А с пикселями текстур нельзя работать? Рендеринг - это искажение.
|
Какое такое искажение? Не замечал чтото.
По поводу SetData разве она будет быстрее чем рендеринг? очень сомневаюсь
|
(Offline)
|
|
27.03.2011, 00:49
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Слияние текстур XNA (Texture2D)
Сообщение от Dream
Какое такое искажение? Не замечал чтото.
|
Прежде чем попасть в цель визуализации спрайт пройдет через GPU, проинтерполирует цвета на текстуре и выведет их. Обычно чтобы попасть точно пиксель в пиксель в шейдерах делают пиксельную коррекцию. Не думаю что такая есть в дефолтном шейдере, который выводит спрайты в XNA.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.03.2011, 00:50
|
#7
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Слияние текстур XNA (Texture2D)
я гарантирую что пнг-jpg текстуры не размазываются если не делать смещения на дробное число.
Последний раз редактировалось Dream, 29.03.2011 в 20:02.
|
(Offline)
|
|
27.03.2011, 00:54
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Слияние текстур XNA (Texture2D)
Сообщение от Dream
я гарантирую что пнг-jpg текстуры не размазываются если не делать смещения на нечётное число.
|
float сам по себе не точный, но в данном случае может и не будет искажений.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:51.
|