Texture scaling

5 отговора 176 прегледа
#1

Texture scaling

Zdraveite.Eto go i vuprosa:

imam daden image sus razmeri primerno 20x31 i iskam da go dogaram do dokaram do razmeri,koito sa stepen na dvoikata(o4evidno nai-bliskite sa 16x32).Imam oba4e edin problem i toi e,4e ne znam is4isleniqta za scalevaneto name image-a.Poje li nqkoi da me naso4i kum dobur image scaling tutorial ili da mi kaje tova onova?Mnoo mersi!

Отговор
в отговор на Mihail121 #2

Re: Texture scaling

Значи, всичко, което трябва да знаеш, е някаква формула (или алгоритъм), по който да изчислиш цвета на всеки един пиксел от новото изображение. За това има различни подходи. Най-грубият е "nearest neighbor", т.е. да вземеш цвета на пиксела от оргиналното изображение, който е най-близо до съответната позиция в новото изображение (т.е. ако искаш, да речем, да сметнеш цвета на пиксел, който се намира на средата на изображението по хоризонталата и на 1/3 по вертикалата, взимаш най-близкия пиксел от оригиналното изображение, който се намира на същата позиция - 1/2 по хоризонталата и 1/3 по вертикалата). Резултатите обаче в повечето случаи не изглеждат никак добре, и този механизъм следва да се ползва само когато имаш нужда от много висока скорост, но не и от качество.

Другите възможни механизми използват интерполации от различен вид. Най-простата например е линейната - ако новият пиксел, например, се пада между два пиксела от оригиналното изображение, можеш да вземеш пропорционално цветовите им компоненти, като по този начин получиш някакъв "среден" цвят, който да ползваш за новия пиксел. Линейна интерполация, защото смяташ пропорциите линейно - ако например се намираш на разстояние 1/3 от единия и 2/3 от другия, взимаш и съответните цветове в съответните съотношения. По-добри резултати обаче могат да се постигнат с нелинейни приближения, като например квадратично или кубично.

Дано това ти свърши някаква работа.

Отговор
в отговор на Mihail121 #3

Re: Texture scaling

Hmmm.Beh videl ne6to takova v Quake2 coda,sega si spomnqm.A sluqaino da moje6 da mi kaje6 nqkakvi primeri ili ... ?Ako ne 6e izmislq i sam ne6to.Ili kakto kazva edin moi posznat:"4oveku e uzelil,6oto e mislil!".Mnogo mersi!

Отговор
в отговор на Mihail121 #4

Re: Texture scaling

предполагам, че ти трябва да използваш image-а в някое от 3D API-ата за текстура...или пък греша?!?!

ако не греша и ползваш OpenGL, можеш да ползваш една готова функция от GLU - gluBuild2DMipmaps(..);
тя с готовност ще ти приеме raw image data, която не е скалирана и не е със размерности степени на 2-ката...

има един друг номер, който като цяло не е сложен - значи вземаш raw data-тата на image-а, копираш го в масив, който ще има размерности степени на 2-ката (задължително по-големи от оригинала) като матрица, която ще е новото изображение в паметта и след това запълваш пикселите, които остават извън оригиналния image с черно (0, 0, 0). След това когато map-ваш текстурните координати, ще трябва да ги коригираш и да ги скалираш така че сочат същото място върху оригиналното изображение, в случая винаги ще се скалира с множител между 0.0 и 1.0, защото винаги ще скалираш нагоре, за да не загубиш пиксел-данни. това можеш да го използваш навсякъде, не само в OpenGL...

дано съм станал ясен. ако има още нещо - питай

най-често умните хора са и лоши
Отговор
в отговор на Mihail121 #5

Re: Texture scaling

аз лично в подобни случаи използвам четириточкова интерполация
kx=fmod(x,1);// x,y -float || double
ky=fmod(y,1);
c=p[x,y]*(1-kx)*(1-ky)+p[x+1,y]*kx*(1-ky)+p[x,y+1]*(1-kx)*ky+p[x+1,y+1]*kx*ky;

Отговор
в отговор на zaphod #6

Re: Texture scaling

Problema e malko po seriosen....pi4a 3D engine i ne mi trqbvat bokluzi kato gluBuild2DMipmaps.Re6ih da iszpolzvam edin ot malko po grubite algoritmi nare4en Nearest Neighbour,koito dava malko zle isglejda6ti resultati,ama pa da ne e moi problem,4e user-a puska ne ^2 razmeri.Are........E tva e!Cha0!

Отговор