Image 过渡着色器

Image 过渡着色器,image,actionscript-3,shader,transition,Image,Actionscript 3,Shader,Transition,我已经创建了一个过渡着色器 这就是is所做的: On each update the color that should be alpha changes. Then preform a check for each pixel. If the color of the pixel is more that the 'alpha' value Set this pixel to transparent. Else If the color of the pixel i

我已经创建了一个过渡着色器

这就是is所做的:

On each update the color that should be alpha changes.
Then preform a check for each pixel.
    If the color of the pixel is more that the 'alpha' value
      Set this pixel to transparent.
    Else If the color of the pixel is more that the 'alpha' value - 50
      Set this pixel to partly transparent.
    Else
      Set the color to black.
编辑(已删除的旧零件):

我尝试将我的GLSL转换为AGAL(使用):

片段着色器:

const float alpha = 0.8;
varying vec2 TexCoord; //not used but required for converting
uniform sampler2D transition;//not used but required for converting

void main()
{
    vec4 color = texture2D(transition, TexCoord.st);//not used but required for converting

    color.a = float(color.r < alpha);

    if(color.r >= (alpha - 0.1)){
        color.a = 0.2 * (color.r - alpha - 0.1);
    }

    gl_FragColor = vec4(0, 0, 0, color.a);
}
const float alpha=0.8;
可变矢量2 TexCoord//未使用,但转换时需要
均匀二维过渡//未使用,但转换时需要
void main()
{
vec4 color=texture2D(transition,TexCoord.st);//未使用,但转换时需要
color.a=浮动(color.r=(alpha-0.1)){
color.a=0.2*(color.r-α-0.1);
}
gl_FragColor=vec4(0,0,0,color.a);
}
我已经自定义了输出,并将其添加到(自定义)Starling过滤器中:

var fragmentShader:String =
    "tex ft0, v0, fs0 <2d, clamp, linear, mipnone>                  \n" + // copy color to ft0
    "slt ft0.w, ft0.x, fc0.x                                        \n" + // alpha = red < inputAlpha
    "mov ft0.xyz, fc1.xyzz                                          \n" + // set color to black
    "mov oc, ft0";

mShaderProgram = target.registerProgramFromSource(PROGRAM_NAME, vertexShader, fragmentShader);
var fragmentShader:String=
“tex ft0,v0,fs0\n”+//将颜色复制到ft0
“slt ft0.w,ft0.x,fc0.x\n”+//alpha=red

它可以工作,当我设置alpha过滤器时,它会更新内容。唯一剩下的是部分透明的东西,但我不知道怎么做。

在Y和X坐标上交换循环。通过在内环中使用X,可以优化CPU的一级缓存和预取器

一些小提示:
删除清除代码的零:

const c:uint = a << 24

const c:uint=a在Y和X坐标上交换循环。通过在内环中使用X,可以优化CPU的一级缓存和预取器

一些小提示:
删除清除代码的零:

const c:uint = a << 24

const c:uint=a使用Starling后,不要疯狂地使用BitmapData

我不知道你是不是自己做的。在not中,只需为灰度创建一个(下面的像素着色器即可)

tex ft0,v0,fs0
添加ft1.x、ft0.x、ft0.y
添加ft1.x、ft1.x、ft0.z
分区ft1.x、ft1.x、fc0.x
mov ft0.xyz,ft1.xxx
mov oc ft0
对于alpha转换,只需扩展Image类,实现IAnimatable并将其添加到Juggler。在advanceTime中,只需执行一个
this.alpha-=值


很简单:)

一旦使用Starling,就不要疯狂地使用BitmapData

我不知道你是不是自己做的。在not中,只需为灰度创建一个(下面的像素着色器即可)

tex ft0,v0,fs0
添加ft1.x、ft0.x、ft0.y
添加ft1.x、ft1.x、ft0.z
分区ft1.x、ft1.x、fc0.x
mov ft0.xyz,ft1.xxx
mov oc ft0
对于alpha转换,只需扩展Image类,实现IAnimatable并将其添加到Juggler。在advanceTime中,只需执行一个
this.alpha-=值


很简单:)

我只想详细说明一下@Paxel的答案。我与另一位开发人员Jackson Dunstan讨论了L1缓存、速度改进的来源,以及可以对这样的代码进行哪些其他改进以提高性能

之后,Jackson发布了一篇博客文章,可在此处阅读:

我会发布一些相关的项目。首先,位图数据按行存储在内存中。行内存地址可能如下所示:

   row 1: 0 1 2 3 4 5
   row 2: 6 7 8 9 10 11
   row 3: 12 13 14 15 16 17
现在通过行运行内部循环将允许您利用一级缓存的优势,因为您可以按顺序读取内存。因此,先内循环X,您将第一行读为:

0 1 2 3 4 5
但如果你先这么做,你会读到:

0 6 12 1 7 13
正如您所看到的,您正在内存地址周围跳跃,这使得它成为一个较慢的进程


至于可以进行的优化,建议缓存宽度和高度获取程序,将属性存储到局部变量中。另外,使用
Math.round()
的速度相当慢,替换它会加快速度。

下面将详细介绍一下@Paxel的答案。我与另一位开发人员Jackson Dunstan讨论了L1缓存、速度改进的来源,以及可以对这样的代码进行哪些其他改进以提高性能

之后,Jackson发布了一篇博客文章,可在此处阅读:

我会发布一些相关的项目。首先,位图数据按行存储在内存中。行内存地址可能如下所示:

   row 1: 0 1 2 3 4 5
   row 2: 6 7 8 9 10 11
   row 3: 12 13 14 15 16 17
现在通过行运行内部循环将允许您利用一级缓存的优势,因为您可以按顺序读取内存。因此,先内循环X,您将第一行读为:

0 1 2 3 4 5
但如果你先这么做,你会读到:

0 6 12 1 7 13
正如您所看到的,您正在内存地址周围跳跃,这使得它成为一个较慢的进程


至于可以进行的优化,建议缓存宽度和高度获取程序,将属性存储到局部变量中。另外,使用
Math.round()
的速度相当慢,替换它会加快速度。

您能否提供任何详细信息或链接,以表明此部分代码存储在一级缓存中?还有关于交换循环将如何强制一级缓存使用的详细信息。交换循环确实有帮助,它现在是23 FPS,而不是20 FPS。(我在帖子中编辑了代码),尽管它仍然没有我希望的那么快。这种功能是否可以通过其他方式实现?在使用GLSL之前,我已经做过这项工作,但我对AGAL一无所知。可能大部分时间都花在getPixel和setPixel中,您是否使用tempBitmapData.setPixel32(x,y,bitmapData.getPixel(x,y))测量了最大理论速度?;另外,通过编辑代码,我的答案现在可能被认为是“错误的”(!)您能否提供任何详细信息或链接,表明这部分代码存储在一级缓存中?此外,还详细介绍了交换循环将如何强制在一级缓存中使用。交换循环确实有帮助,它现在是23 FPS,而不是20 FPS。(我很抱歉。)