![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Jul 2011
Сообщений: 32
|
Рисую в BitmapData с нулевой альфой. Заполняющие пикселя имеют альфу = 1 и не касаются границ BitmapDatы. Границы, полученного рисунка надо разгладить (т.е. только пиксели, имеющие в соседях альфу = 0).
Набросал такой шейдер: >
{
input image4 src;
output pixel4 dst;
void
evaluatePixel()
{
dst = sampleNearest(src,outCoord());
if(dst.a > 0.0){
float2 s = outCoord();
pixel4 p0 = sampleNearest(src, float2(s.x, s.y - 1.0));
pixel4 p1 = sampleNearest(src, float2(s.x - 1.0, s.y));
pixel4 p2 = sampleNearest(src, float2(s.x - 1.0, s.y - 1.0));
pixel4 p3 = sampleNearest(src, float2(s.x - 1.0, s.y + 1.0));
if(!all(bool4(int(p0.a), int(p1.a), int(p2.a), int(p3.a)))) {
p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
dst.rgb = (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb) / 5.0;
dst.a = dst.a;
} else {
p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
pixel4 p4 = sampleNearest(src, float2(s.x + 1.0, s.y - 1.0));
pixel4 p5 = sampleNearest(src, float2(s.x + 1.0, s.y + 1.0));
if(!all(bool4(int(p2.a), int(p3.a), int(p4.a), int(p5.a)))) {
dst.rgb = (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb) / 5.0;
dst.a = dst.a;
}
}
}
}
}
[Embed(source = "courveedge.pbj", mimeType = "application/octet-stream")] var AaEdge:Class; var shader:Shader = new Shader(); shader.byteCode = new AaEdge(); var shaderFilter:ShaderFilter = new ShaderFilter( shader ); bmd.applyFilter(bmd, new Rectangle(0, 0, bmd.width, bmd.height), new Point(), shaderFilter); var bmp:Bitmap = new Bitmap(bmd); Если кому очевидно, в чем проблема, плз, поясните и мне. |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
А если так:
<languageVersion : 1.0;>
kernel NewFilter
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
description : "your description";
>
{
input image4 src;
output pixel4 dst;
void evaluatePixel()
{
dst = sampleNearest(src,outCoord());
if(dst.a > 0.0){
float2 s = outCoord();
pixel4 p0 = sampleNearest(src, float2(s.x, s.y - 1.0));
pixel4 p1 = sampleNearest(src, float2(s.x - 1.0, s.y));
pixel4 p2 = sampleNearest(src, float2(s.x - 1.0, s.y - 1.0));
pixel4 p3 = sampleNearest(src, float2(s.x - 1.0, s.y + 1.0));
if((p0.a * p1.a * p2.a * p3.a) < 1.0) {
p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
dst.rgb = 0.2 * (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb);
// dst = float4(1.0, 0.0, 1.0, 1.0);
} else {
p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
pixel4 p4 = sampleNearest(src, float2(s.x + 1.0, s.y - 1.0));
pixel4 p5 = sampleNearest(src, float2(s.x + 1.0, s.y + 1.0));
if((p2.a * p3.a * p4.a * p5.a) < 1.0) {
dst.rgb = 0.2 * (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb);
// dst = float4(0.0, 0.0, 0.0, 1.0);
}
}
}
}
}
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
|
Регистрация: Jul 2011
Сообщений: 32
|
Это работает. Я, правда, хотел более общий случай - с произвольной (не нулевой) альфой. Но в целом, смысл ясен - с булевой "all" надо расстаться. Спасибо!
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:50. |
|
|
« Предыдущая тема | Следующая тема » |
|
|