让我们来创建后期效果-高动态光照渲染!

先放2张图
第1张是没有HDR效果的。
cryb

第2张是HDR效果的
crya

这个效果原本是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

发表评论

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