先放2张图
第1张是没有HDR效果的。
第2张是HDR效果的
这个效果原本是GLSL的Shader. 我先移植到 Pixel Bender 上验证自己的理解没有错后,再移植到AGAL上,最后和之前的Blur效果融合。
这是Pixel Bender 的代码
[cc lang=”C++”]
kernel Lum
< namespace : "cn.dreamfairy";
vendor : "dreamfairy";
version : 1;
>
{
input image4 baseTex;
input image4 bloomTex;
output pixel4 dsts;
//外部参数
parameter float fAvgLum
<
minValue:float(0.1);
maxValue:float(0.5);
defaultValue:float(0.5);
>;
parameter float fDimmer
<
minValue:float(0);
maxValue:float(1);
defaultValue:float(1);
>;
void
evaluatePixel()
{
float4 texCol = sampleNearest(baseTex,outCoord());
//计算平均亮度
float vLum = 0.27 * texCol.r + 0.67 * texCol.g + 0.06 * texCol.b;
//亮度缩放
float vLumScaled = fDimmer * vLum / fAvgLum;
texCol = float4(texCol.r * vLumScaled, texCol.g * vLumScaled,
texCol.b * vLumScaled, texCol.a * vLumScaled);
texCol = texCol / (float4(1.0) + texCol);
float4 texBloom = sampleNearest(bloomTex, outCoord());
dsts = texBloom + texCol;
}
}
[/cc]
下面是AGAL代码
[cc lang=”actionscript3″]
fragmentProgram.assemble(Context3DProgramType.FRAGMENT,
//原始图采样
“tex ft0, v0, fs0<2d, clamp, linear>n” +
//初始化ft1
“mov ft1, ft0n” +
//计算亮度值亮度值
“mul ft1.rgb, ft1.rgb, fc0.rgbn” +
//亮度缩放
“mov ft2, fc3n” +
“add ft2.x, ft2.x, ft1.rgbn” +
“mul ft2.x, ft2.x, fc1.yn” +
“div ft2.w, ft2.x, fc1.xn” +
//亮度强化
“mul ft0.rgba, ft0.rgba, ft2.wn” +
“mov ft3, fc2n” +
“add ft3, ft3, ft0n” +
“div ft0, ft0, ft3n” +
//模糊图采样
“tex ft4, v0, fs1<2d, clamp, linear>n” +
//混合输出
“add ft0, ft0, ft4n” +
“mov oc, ft0n”);
m_hdrShader = m_context.createProgram();
m_hdrShader.upload(vertexProgram.agalcode, fragmentProgram.agalcode);
[/cc]
最后是Demo啦: 模糊效果必须在开启HDR后才生效
Demo: check it here