在Stage3D中实现X-Ray透视效果

在stage3D中实现火炬之光遮挡透视的X-ray效果实际上很简单。
渲染流程如下

1.渲染所有物体+场景
2.正常渲染主角
3.使用X-ray Shader再渲染一次主角

这个渲染顺序是必须的,必须把遮挡物体都事先渲染完毕。
之后展开第3点看看具体的渲染流程

设置 depthFunc 为 Greater, writeDepth 为 false
此时渲染的主角只会显示在 遮挡物体上
之后对该角色的像素着色器,使之显示单一颜色,无论蓝色,黄色,红色都可以
为了使Shader只渲染出轮廓,可以将 相机位置当做灯光位置和模型的法线点乘,求出夹角,将该值作为输出像素的透明度值和RGB进行混合输出。

像素着色器AGAL如下
[cc lang=”actionscript3″]
public override function getFragmentProgram():ByteArray
{
var shaderConstant : ShaderConstants;
var index : uint;
index = m_params.fragmentShaderConstants.push(new ShaderConstants(fcXray)) – 1;
shaderConstant= m_params.fragmentShaderConstants[index];
shaderConstant.vector = Vector.([
10/255,72/255,247/255,0.5,
1,0,0,0]);
shaderConstant.numRegisters = 2;

var code : String =
“nrm ft1.xyz v”+vProjPos+”.xyzn” +
“dp3 ft0.a ft1.xyz fc”+fcCameraPos+”.xyzn”+
“sat ft0.a ft0.an”+
“mov ft0.r fc”+fcXray+”.rn”+
“mov ft0.g fc”+fcXray+”.gn”+
“mov ft0.b fc”+fcXray+”.bn”+
“mul ft0.rgb ft0.rgb ft0.aaan”+
“mov oc ft0n”;

return new AGALMiniAssembler().assemble(Context3DProgramType.FRAGMENT, code);
}
[/cc]

fcXray 的值为
[10/255,72/255,247/255,0.5,1,0,0,0]
占用两个寄存器,前3个值可以调节输出的颜色
fcCameraPos 为外部传入的相机位置,已经归一化和反转过

发表评论

电子邮件地址不会被公开。 必填项已用*标注