ПрограммированиеФорум2D графика и изометрия

Текстуры не кратные 2

#0
22:16, 30 июня 2010

Предыстория.
Увидели художники, что в некоторых играх вместо текстурных атласов на один объект - одна текстура. И не какая нибудь, а совпадающая с координатами объекта, например 180х63,  52х68 и.т.д.
Захотели упростить себе работу, донесли эту идею шефу, а шеф донёс требование до меня :)

В общем, игры то у нас казуальные, и как я понимаю, не у всех игроков видеокарты будут поддерживать NPOT текстуры без приведения их к степени 2.
Потому после создания текстуры я высчитываю насколько видеокарта растянула текстуру и потом скэйлю до требуемого размера объект.
Вроде бы всё работает, но после всех этих манипуляций текстура довольно сильно размывается.

Подскажите, как можно обойти этот прикол с размыванием?

P.S. API DirectX 8.0

#1
22:38, 30 июня 2010

Сам расширяй текстуру до следующего 2^n (не растягивая саму картинку), заполняя прозрачным фоном. А при выводе объекта расчитывай новые текстурные координаты по типу: (0, 0, obj.width/tex.width, obj.height/tex.height)

#2
22:53, 30 июня 2010

Для этого придётся считывать изображение в оперативку, там вручную добавлять прозрачный фон, потом через функцию D3DXCreateTextureFromMemory создавать текстуру, я правильно понимаю?

#3
22:58, 30 июня 2010

В лучшем случае так, да )

#4
22:59, 30 июня 2010

Понятно, благодарю за помощь :)
p.s. как же я "люблю" своих художников)

#5
23:32, 30 июня 2010

> Увидели художники, что в некоторых играх вместо текстурных атласов на один
> объект - одна текстура. И не какая нибудь, а совпадающая с координатами
> объекта, например 180х63, 52х68 и.т.д.
> Захотели упростить себе работу, донесли эту идею шефу, а шеф донёс требование
> до меня :)
поискать тулзу которая автоматом текстуры в атласы складывает

#6
23:41, 30 июня 2010

По голове бы им настучать!

#7
23:51, 30 июня 2010

"поискать тулзу которая автоматом текстуры в атласы складывает"
Наверное для оптимизации буду делать это динамически при старте движка :)

#8
0:50, 1 июля 2010

оптимально, конечно, это делать во время сборки билда. и автоматически

#9
2:46, 1 июля 2010

У меня делается динамически - во время работы игры грузятся PNG или JPEG совершенно случайных размеров и скидываются в атласы со страницей 2048х2048, если страница заполнена - создаётся вторая итд. Алгоритм заполнения идея отсюда - http://www.blackpawn.com/texts/lightmaps/default.html реализация своя. Вокруг кадров в атласе создаются рамки шириной в 1 пиксель (не использую MIP map потому 1 пикс. достаточно) с копией цвета из крайнего пикселя картинки. Ну и всё отлично.

#10
9:04, 1 июля 2010

kvaks:
Можешь сказать, чем грузишь PNG?
Я пробую сейчас через FreeImage, файл загрузил, создал текстуру, залочил, по туториалу из документации FreeImage переписал значение пикселов в текстуру.
Но когда вывожу её на экран, картинка выводится сильно побитой, сплющенной.
Код, которым я переписываю значения пикселов:

      BYTE * bits = FreeImage_GetBits(dib);    
      bits +=pitch*height-pitch;
      for (int y=0; y<height; y++)
      {
        BYTE * pixel = (BYTE*)bits;
        for (int x=0; x<width; x++)
        {
          PixelMap[x*4+(pitch*4*(y+1))]  = pixel[0];//blue
          PixelMap[x*4+(pitch*4*(y+1))+1]  = pixel[1];//green
          PixelMap[x*4+(pitch*4*(y+1))+2]  = pixel[2];//red
          PixelMap[x*4+(pitch*4*(y+1))+3]  = pixel[3];//alpha
          pixel+=4;
        }
        bits-=pitch;
      }
#11
9:16, 1 июля 2010

Слева то, что получается у меня.
Справа то, как должно быть.

Изображение
#12
11:40, 1 июля 2010

Проблема решена.
Вместо pitch, который я получал из FreeImage, я использовал Pitch полученный в структуру D3DLOCKED_RECT.
Всем огромное спасибо за помощь и советы!

ПрограммированиеФорум2D графика и изометрия

Тема в архиве.