Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   попиксельная точность drawTriangles/правила растеризации её (http://www.flasher.ru/forum/showthread.php?t=155541)

-De- 06.05.2011 02:07

попиксельная точность drawTriangles/правила растеризации её
 
Пример: берём битмапу (рисуем на ней), рисуем втупую её 1 к 1 квадом при помощи drawTriangles - то, что нарисовано не совпадает с выведенной рядом битмапой. Код ниже это и делает.
Нашел какой-то шаманский способ сделать, чтоб 1 к 1 выводило корректно. Но 1 к 2 (drawTriangles рисует в 2 раза увеличенную битмапу) - не хочет совсем никак.
Собсно хочу об этом поговорить =) Дядьки (и тётки), научите, как работает drawTriangles и как её заставить нарисовать в 2 раза увеличенную модель корректно. По какому принципу оно рисует так, как рисует? Вроде имею представление, как тексели в пикселы перелезают, но везде в 2 раза увеличить текстуру при этом - нет проблем.
Растеризация при помощи moveTo/lineTo и матрицы при beginBitmapFill - работает отлично.
Собсно, если нельзя корректно даже в 2 раза увеличенную текстуру на кваде нарисовать, то как-то стрёмно вообще drawTriangles использовать.
Код AS3:

var xSize:int = 4;//размеры битмапы, можно ими играться
                        var ySize:int = 4;
                        var s:Shape = new Shape();
                        s.x = xSize;
                        s.y = ySize;
 
                        var bmpd:BitmapData = new BitmapData(xSize, ySize, true, 0xffffffff);
                        for (var i:int = 0; i < Math.min(xSize, ySize); ++i) {
                                bmpd.setPixel(i, i, 0x0);
                        }
                        var bmp:Bitmap = new Bitmap(bmpd);
                        addChild(bmp);
                        s.graphics.beginBitmapFill(bmpd, null, true, false);
                        var testv:Vector.<Number> = new Vector.<Number>();
                        var rectCoords:Rectangle = new Rectangle(0, 0, xSize, ySize);//умножьте xSize и xSize на n, чтоб в n раз больше рисовалась
                        testv.push( rectCoords.x, rectCoords.y, rectCoords.x, rectCoords.height, rectCoords.width,
                        rectCoords.y, rectCoords.x, rectCoords.height, rectCoords.width, rectCoords.y, rectCoords.width, rectCoords.height);
 
                        var pixelmul:Number = 0.0;//если поставить 0.5, то в масштабе 1 к 1 (и только) нарисует корректно
                        var pixelDerX:Number = bmpd.width;
                        var pixelDerY:Number = bmpd.height;
 
                        var one:Number = 1;//это уже от безысходности %)
                        var two:Number = 1;
                        var texCoords:Rectangle = new Rectangle(0 + one * pixelmul / pixelDerX, 0 + one * pixelmul / pixelDerY,
                                        1 + two * pixelmul / pixelDerX, 1 + two * pixelmul / pixelDerY);
                        //var tVal:Number = 1;
                        var testt:Vector.<Number> = new Vector.<Number>();
                                        testt.push( texCoords.x, texCoords.y,// tVal,
                                        texCoords.x, texCoords.height,// tVal,
                                        texCoords.width, texCoords.y,// tVal,
                                        texCoords.x, texCoords.height,// tVal,
                                        texCoords.width, texCoords.y,// tVal,
                                        texCoords.width, texCoords.height//, tVal
                                        );
 
                        s.graphics.drawTriangles(testv, null, testt);
 
                        addChild(s);


Zebestov 06.05.2011 13:31

При текстурировании треугольника происходит интерполяция, которая далека от копирования точек 1-в-1 из текстуры в рамках треугольной области.

-De- 06.05.2011 14:18

А как она работает-то на флэше?
Если нельзя получить тупо в 2 раза увеличенную текстуру, то это хреновая интерполяция. У меня было текстурирование треугольников при помощи moveTo/lineTo и матрицы при beginBitmapFill - всё отлично и предсказуемо (ну без перспективной коррекции, есстесно). В директе тоже 0 проблем.

Zebestov 06.05.2011 15:08

Покажи, что у тебя выходит.

-De- 06.05.2011 17:05

ээ выше ж код, в комментах написано, что делать, чтоб в 2 раза увеличить. При moveTo/lineTo - тупо всё как надо, код не приводил, чтоб не захламлять.

Zebestov 06.05.2011 17:11

Я имел в виду изображения.

zuxul 06.05.2011 17:32

Код AS3:

var xSize:int = 50;//размеры битмапы, можно ими играться
var ySize:int = 50;
var s:Shape = new Shape();
s.x = xSize;
s.y = ySize;
 
var bmpd:BitmapData = new BitmapData(xSize, ySize, true, 0xffffffff);
var testShape:Shape = new Shape();
testShape.graphics.beginFill(0xFF0000);
testShape.graphics.drawCircle(25, 25, 15);
testShape.graphics.endFill();
bmpd.draw(testShape);
var bmp:Bitmap = new Bitmap(bmpd);
addChild(bmp);
 
s.graphics.beginBitmapFill(bmpd, null, true, false);
s.graphics.drawTriangles(
        Vector.<Number>([0, 0, 100, 0, 0, 100, 100,100]),
        Vector.<int>([0, 1, 2, 1, 3, 2]),
        Vector.<Number>([0,0,1,0,0,1,1,1]));
 
addChild(s);


-De- 06.05.2011 17:44

Изображение, на котором виден горький катаклизм в том коде генерится, мож фон поменять на чёрный, или цвет чёрный непрозрачный поставить в setPixel().

zuxul 06.05.2011 17:51

да, с линией получается одна Жирная точка посередине...

Добавлено через 1 минуту
а, вот если smooth поставить в beginBitmapFill, то более-менее.

Добавлено через 3 минуты
нда, вообщем жесть...

kseniya 06.05.2011 18:22

Почему не устраивает вариант с увеличением изображения с помощью Matrix.scale?
Код AS3:

var bmpd:BitmapData = new BitmapData(100,100);
var matrix = new Matrix();
matrix.scale(2,2);
bmpd.draw(mc, matrix);
addChild(new Bitmap(bmpd));



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

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.