Actionscript 3 + AGAL淡化平面透明边缘

时间:2013-05-17 02:55:10

标签: actionscript-3 stage3d agal

我在由2个三角形组成的简单Stage3D平面上显示2D内容。内容在BitmapData上绘制,并在重绘时作为纹理上传。我还有AGAL程序,为整个容器提供透明度。

我想要做的是使用GPU为容器的边缘提供“淡入透明”效果,以便与其他容器很好地融合。还要使用程序常量来控制褪色的边缘。

目前使用此着色器代码:

顶点汇编程序:

"m44 op, va0, vc0 \n" + 
"mov v0, va0 \n" + // tell fragment shader about XYZ
"mov v1, va1 \n" + // tell fragment shader about UV
"mov v2, va2\n";   // tell fragment shader about RGBA

片段汇编程序:

"tex ft0, v1, fs0 <2d,clamp,linear> \n" + 
"mul ft0.a, ft0.a, fc0.x\n" + // manage alpha value that is set as program constant
"mov oc, ft0 \n"; // move this value to the output color

非常感谢任何帮助或提示

1 个答案:

答案 0 :(得分:1)

透明度非常简单,特别是在您提供的简单示例中。在这种情况下,您要做的是使用UV坐标来创建alpha蒙版。由于UV从0变为1,因此在您的片段程序中,一种简单的方法是执行此操作:

//assume [0.5, 2.0, 1.0, 10.0] is in fragment constant 0
sub ft1.xy, va1.xy, fc0.xx  //subtract 0.5 from UV, and store in temporary register 1
mul ft1.xy, ft1.xy, fc0.yy  //multiply UV by 2.0, UV now scaled from -1-to-0-to-1
abs ft1.xy, ft1.xy  //UV now scaled from 1-to-0-to-1
sub ft1.xy, fc0.zz, ft1.xy  //UV now scaled from 0-to-1-to-0
pow ft1.xy, ft1.xy, fc0.ww  //UV has been turned into alpha, with fade controlled by fc0.w
mul ft1.a, ft1.x, ft1.y  //combine U and V alpha into a single alpha value
mul ft0.a, ft0.a, ft1.a  //combine UV-based alpha with existing alpha

另外,不要忘记使用以下内容启用context3d的透明度:

if(transparent)
    context3d.setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA);
else
    context3d.setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO);

否则您的透明像素将无法正确混合。

最后一个警告。如果您计划将透明位图重叠到场景中的任何其他对象上,则必须以相反的顺序从相机渲染场景中的对象。通过在缓冲区中呈现的像素顶部渲染像素来处理透明度。如果首先渲染一个接近透明的对象,然后尝试渲染它后面的对象,z-buffer检查将阻止绘制更远的对象,并且您将无法获得您之后的透明外观。