Правильное задание параметров для шейдера (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
}
}
}
|