我在由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如有任何帮助或提示,我们将非常感谢
发布于 2013-07-06 09:28:02
透明度是非常简单的,特别是在您提供的简单示例中。在这种情况下,您要做的是使用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顺序渲染场景中的对象。透明度是通过在缓冲区中已经渲染的像素之上渲染像素来处理的。如果首先渲染一个接近的透明对象,然后尝试在其后面渲染一个对象,则z缓冲区检查将阻止绘制更远的对象,并且您将无法获得所需的透明外观。
https://stackoverflow.com/questions/16600691
复制相似问题