我在由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
非常感谢任何帮助或提示
答案 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检查将阻止绘制更远的对象,并且您将无法获得您之后的透明外观。