DirectX9 SDK Samples(25) DepthOfField

本文介绍如何在图形渲染中实现景深效果,通过三个步骤:在顶点着色器中保存深度信息,渲染模糊场景图,并在像素着色器中进行最终合成。文中还提供了具体的FX代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

景深和HDR一样,都是post-process,因此他们都需要多个RenderTarget(一般),然后将场景渲染一遍,再进行进一步处理。

景深比HDR简单一些,大体上有三个步骤:1在渲染场景的VS中,将顶点有关深度的信息(例如BlurFactor,或者直接深度)保存在Alpha通道中;2渲染一个模糊的场景图,这里可以采用和HDR中一样的处理;3在PS中利用深度信息将模糊图和普通图进行插值渲染。

下面是FX文件中比较重要的代码:

    // Compute blur factor and place in output alpha
    fBlurFactor      = dot(float4(vViewPosition, 1.0), vFocalPlane)*fHyperfocalDistance;
    Output.Diffuse.a = fBlurFactor*fBlurFactor;
计算BlurFactor。

    for(int i = 0; i < 3; i++)
    {
        // Lookup into the rendertarget based on a texture coord.
        // See app's SetupQuad() to see how the texture coords are created 
        Jitter[i] = tex2D(RenderTargetSampler, JitterUV[i]);
        
        // Lerp between original rgb and the jitter rgb based on the alpha value
        if( bWithRings )
            Jitter[i].rgb = lerp(Original.rgb, Jitter[i].rgb, Original.a);
        else
            Jitter[i].rgb = lerp(Original.rgb, Jitter[i].rgb, saturate(Original.a*Jitter[i].a));
    }
        
    // Average the first two jitter samples
    Blurred = lerp(Jitter[0].rgb, Jitter[1].rgb, 0.5);
    
    // Equally weight all three jitter samples
    Blurred = lerp(Jitter[2].rgb, Blurred, 0.66666);

采样数为4,注意,这个例子没有采用直接渲染一个模糊场景,而是在PS中进行模糊计算,这样效率应该没有预先渲染的好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值