Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Правильное задание параметров для шейдера (2 input изображения) (http://www.flasher.ru/forum/showthread.php?t=150588)

gr_crd 14.02.2011 16:19

Правильное задание параметров для шейдера (2 input изображения)
 
(Выбрал раздел AS3, потомучто по созданию шейдера нет вопроса - вопрос по ошибке в AS3)

Сложилась следующая ситуация.
Есть шейдер. (просто для теста)

Код:

<languageVersion : 1.0;>

kernel test
<  namespace : "_";
    vendor : "_";
    version : 1;
    description : "test"; >
{
  input image4 src1;
  input image4 src2;
  output pixel4 dst;
 
  void evaluatePixel()
  {
        dst = sampleNearest(src2,float2(outCoord().x,outCoord().y));
  }
}

нужно задать для него входные параметры — два изображения (src1, src2)

читаю в хелпе:

However, in some cases, especially if a shader defines multiple inputs, you do explicitly set a value for an input. Each input that is defined in a shader is represented in ActionScript by a ShaderInput object. The ShaderInput object is a property of the ShaderData instance in the Shader object’s data property, as described in Identifying shader inputs and parameters. For example, suppose a shader defines an input named src, and that shader is linked to a Shader object named myShader. In that case you access the ShaderInput object corresponding to the src input using the following identifier:

myShader.data.src

я так понял — myShader - Shader, src — имя параметра (в моем случае src1, src2)

пробую таим способом:

Код AS3:

var shdInput1:ShaderInput=new ShaderInput();
var shdInput2:ShaderInput=new ShaderInput();
shdInput1.input=img1.bitmapData;
shdInput2.input=img2.bitmapData;
//
shader.data.src1=shdInput1;
shader.data.src2=shdInput2;

далее:

Код AS3:

var sf:ShaderFilter=new ShaderFilter(shader);
//
someBitmap.filters=[sf];

ошибка:
Код:

ArgumentError: Error #2163: Тип входа шейдера src1 не совместим с этой операцией.
        at flash.display::DisplayObject/set filters()

ок, нашел на одном форуме такую запись:
Код AS3:

shader.data.src.input = new Autumn(0,0);//set the input

Autumn - BitmapData.

пробую:
Код AS3:

shader.data.src1.input=img1.bitmapData;
shader.data.src2.input=img2.bitmapData;

ошибка:
Код:

TypeError: Error #1010: Термин не определен и не имеет свойств.
пробую без input:
Код AS3:

shader.data.src1=img1.bitmapData;
shader.data.src2=img2.bitmapData;

ошибка:
Код:

ArgumentError: Error #2167: Для этой операции шейдер не имеет требуемого количества входов.
        at flash.display::DisplayObject/set filters()

вот что дает trace
Код AS3:

var shdData:ShaderData=shader.data;
for (var prop:String in shdData)
{
  trace(shdData[prop]);
}

Код:

_
test
[object BitmapData]
test
1
[object BitmapData]
_

т.е. я так понял, два [object BitmapData], каких еще входов не хватает?

на Adobe Forums нашел похожий пост. Там проблема решилась путем добавления input
Код AS3:

shader.data.src1.input

но в моем случае не помогло.

Еще пишут:
Цитата:

because you weren't using the input, it was removed as a compiler optimization for Flash. We should have given you a warning there, so that is our bad. I'll file a bug.
Но в другом шейдере, ранее, я использовал оба изображения — возникали те же самые ошибки, что и сегодня.

Вот... Где я ошибаюсь? Как правильно задать эти параметры?

ps. на всякий случай весь код

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Shader;
        import flash.display.ShaderData;
        import flash.display.ShaderInput;
        import flash.display.ShaderJob;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.filters.ShaderFilter;
 
        /**
        * ...
        * @author criadone
        */

        public class Main extends Sprite
        {
 
                [Embed(source="../test1.pbj", mimeType="application/octet-stream")]
                private var ShaderClass:Class;
 
                [Embed(source = "../image1.jpg")]
                private var Source1:Class;
                private var img1:Bitmap=new Source1();
 
                [Embed(source = "../image2.jpg")]
                private var Source2:Class;
                private var img2:Bitmap=new Source2();
 
                private var shader:Shader;
                private var sf:ShaderFilter;
                private var someBitmap:Bitmap;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        //
                        someBitmap=new Bitmap(new BitmapData(640,480,false,0x303030));
                        addChild(someBitmap);
                        //
                        shader = new Shader();
                        shader.byteCode = new ShaderClass();
                        //
                        var shdInput1:ShaderInput=new ShaderInput();
                        var shdInput2:ShaderInput=new ShaderInput();
                        shdInput1.input=img1.bitmapData;
                        shdInput2.input=img2.bitmapData;
                        //
                        shader.data.src1=img1.bitmapData;
                        shader.data.src2=img2.bitmapData;
 
                        var shdData:ShaderData=shader.data;
 
                        for (var prop:String in shdData)
                        {
                                trace(shdData[prop]);
                        }
 
                        //
                        var sf:ShaderFilter=new ShaderFilter(shader);
                        //
                        someBitmap.filters=[sf];
                        //1
                }
 
        }
}


arkadattx 14.02.2011 16:27

Так для пиксель-бендера свой раздел есть.
К сожалению по сабжу не компетентен.

gr_crd 14.02.2011 17:40

все, разобрался.
запись вида
Код AS3:

shader.data.src1.input

правильна.

просто один из инпутов и вправду не использовался и был проигнорирован при компиляции.


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

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