DirectX9 SDK Samples(20) HDRDemo Sample(3)

DirectX9 示例:绘制茶壶 ////////////////////////////////////////////////////////////////////////////////////////////////// // // File: teapot.cpp // // Author: Frank Luna (C) All Rights Reserved // // System: AMD Athlon 18 阅读详情

HDR需要对源场景进行处理,因此在渲染初始源场景的时候,也要创建一个纹理,并且将场景渲染到这个纹理上,然后进行HDR处理。这个例子中,上述工作由HDRScene完成。关于渲染到纹理,这篇博文讲得很清楚:http://www.cnblogs.com/graphics/archive/2011/04/23/2024294.html

那么到此为止,我们明白了如何进行计算平均亮度,如何进行Bloom,如何渲染场景到纹理上。那么接下来我们就应该将这些东西组合起来,完成HDR的渲染。

让我们直接进入RenderScene函数:

    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {

        // RENDER THE COMPLETE SCENE
        //--------------------------
        // The first part of each frame is to actually render the "core"
        // resources - those that would be required for an HDR-based pipeline.

        // HDRScene creates an unprocessed, raw, image to work with.
        HDRScene::RenderScene( pd3dDevice );

        // Luminance attempts to calculate what sort of tone/mapping should
        // be done as part of the post-processing step.
        Luminance::MeasureLuminance( pd3dDevice );

        // The post-processing adds the blur to the bright (over-exposed) areas
        // of the image.
        PostProcess::PerformPostProcessing( pd3dDevice );
上面三个简单的句子就是前面讲过的渲染场景到纹理、计算平均亮度和Bloom。

            LPDIRECT3DSURFACE9 pFinalSurf = NULL;
            g_pFinalTexture->GetSurfaceLevel( 0, &pFinalSurf );
            pd3dDevice->SetRenderTarget( 0, pFinalSurf );

            LPDIRECT3DTEXTURE9 pHDRTex = NULL;
            HDRScene::GetOutputTexture( &pHDRTex );

            LPDIRECT3DTEXTURE9 pLumTex = NULL;
            Luminance::GetLuminanceTexture( &pLumTex );

            LPDIRECT3DTEXTURE9 pBloomTex = NULL;
            PostProcess::GetTexture( &pBloomTex );

            pd3dDevice->SetTexture( 0, pHDRTex );
            pd3dDevice->SetTexture( 1, pLumTex );
            pd3dDevice->SetTexture( 2, pBloomTex );

            pd3dDevice->SetPixelShader( g_pFinalPassPS );

            D3DSURFACE_DESC d;
            pBloomTex->GetLevelDesc( 0, &d );
            g_pFinalPassPSConsts->SetFloat( pd3dDevice, "g_rcp_bloom_tex_w", 1.0f / static_cast< float >( d.Width ) );
            g_pFinalPassPSConsts->SetFloat( pd3dDevice, "g_rcp_bloom_tex_h", 1.0f / static_cast< float >( d.Height ) );
            g_pFinalPassPSConsts->SetFloat( pd3dDevice, "fExposure", g_fExposure );
            g_pFinalPassPSConsts->SetFloat( pd3dDevice, "fGaussianScalar", PostProcess::GetGaussianMultiplier() );

            DrawHDRTextureToScreen();
//省略
            pd3dDevice->SetRenderTarget( 0, pLDRSurface );
然后就是调用最后一个着色器完成合并工作。注意最后一句,将渲染目标还原为原来的LDR平面,其实也没用到。

前面没有看过FX文件,因为其实都比较简单。下面就看一下最后的这个PS完成了什么。

float4 main( in float2 t : TEXCOORD0 ) : COLOR0
{

    // Read the HDR value that was computed as part of the original scene
        float4 c = tex2D( original_scene, t );
    
    // Read the luminance value, target the centre of the texture which will map to the only pixel in it!
        float4 l = tex2D( luminance, float2( 0.5f, 0.5f ) ); //也就是亮度平均值
        
    // Compute the blur value using a bilinear filter
        float xWeight = frac( t.x / g_rcp_bloom_tex_w ) - 0.5;
        float xDir = xWeight;
        xWeight = abs( xWeight );
        xDir /= xWeight;
        xDir *= g_rcp_bloom_tex_w;

        float yWeight = frac( t.y / g_rcp_bloom_tex_h ) - 0.5;
        float yDir = yWeight;
        yWeight = abs( yWeight );
        yDir /= yWeight;
        yDir *= g_rcp_bloom_tex_h;

    // sample the blur texture for the 4 relevant pixels, weighted accordingly
        float4 b = ((1.0f - xWeight) * (1.0f - yWeight))    * tex2D( bloom, t );        
        b +=       (xWeight * (1.0f - yWeight))             * tex2D( bloom, t + float2( xDir, 0.0f ) );
        b +=       (yWeight * (1.0f - xWeight))             * tex2D( bloom, t + float2( 0.0f, yDir ) );
        b +=       (xWeight * yWeight)                      * tex2D( bloom, t + float2( xDir, yDir ) );
            
    // Compute the actual colour:
        float4 final = c + 0.25f * b;
            
    // Reinhard's tone mapping equation (See Eqn#3 from 
    // "Photographic Tone Reproduction for Digital Images" for more details) is:
    //
    //      (      (   Lp    ))
    // Lp * (1.0f +(---------))
    //      (      ((Lm * Lm)))
    // -------------------------
    //         1.0f + Lp
    //
    // Lp is the luminance at the given point, this is computed using Eqn#2 from the above paper:
    //
    //        exposure
    //   Lp = -------- * HDRPixelIntensity
    //          l.r
    //
    // The exposure ("key" in the above paper) can be used to adjust the overall "balance" of 
    // the image. "l.r" is the average luminance across the scene, computed via the luminance
    // downsampling process. 'HDRPixelIntensity' is the measured brightness of the current pixel
    // being processed.
    
        float Lp = (fExposure / l.r) * max( final.r, max( final.g, final.b ) );
    
    // A slight difference is that we have a bloom component in the final image - this is *added* to the 
    // final result, therefore potentially increasing the maximum luminance across the whole image. 
    // For a bright area of the display, this factor should be the integral of the bloom distribution 
    // multipled by the maximum value. The integral of the gaussian distribution between [-1,+1] should 
    // be AT MOST 1.0; but the sample code adds a scalar to the front of this, making it a good enough
    // approximation to the *real* integral.
    
        float LmSqr = (l.g + fGaussianScalar * l.g) * (l.g + fGaussianScalar * l.g);
    
    // Compute Eqn#3:
        float toneScalar = ( Lp * ( 1.0f + ( Lp / ( LmSqr ) ) ) ) / ( 1.0f + Lp );
    
    // Tonemap the final outputted pixel:
        c = final * toneScalar;
    
    // Return the fully composed colour
        c.a = 1.0f;
        return c;
}
着色器完成了从纹理取值,并且根据公式计算像素颜色的工作。
DrawHDRTextureToScreen()完成的工作跟以前的同类函数类似,就是将纹理渲染到屏幕上。

到此为止,HDR渲染就差不多了。


dx9_2d_demo_game directx9实现2D游戏例程 Windows Develop dx9_2d_demo_game directx9实现2D游戏例程 是一个用Direct9 写的一个2D 飞机游戏 立即下载

相关推荐

D3D DX9 游戏demo源码 场景loading 人物骨骼动画

上学的时候写的一个demo 记得写了好久.. 很多封装类可以直接用。基本功能都有了 自我感觉还算完善~可以选人 可以升级- - 天空盒 碰撞 拾取 骨骼动画 模型 等等

DirectX9 SDK Samples(20) HDRDemo Sample(1)

HDR,这里有一篇写得不错的:http://www.zwqxin.com/archives/shaderglsl/review-high-dynamic-range.html 原理可以参考上面的博文~那就进入代码。 首先我们看看Luminance部分,也就是计算平均亮度的部分。 LPDIRECT3DPIXELSHADER9 g_pLumDispPS = NULL; /

1435

一个简单的FPS游戏DEMO,VC,directx9编写

本人新手,算是自学了一年DX的成果。一个FPS游戏DEMO。有第一人称武器,枪口muzzle火焰,地形,天空盒,小物品等 需要源码的新人加我QQ254384870吧,本人也是新手。。。老鸟请无视吧

Direct3D 9的介绍以及Demo演示

Direct3D 9的介绍以及Demo演示

森明帮大于黑虎帮的博客 3418

HDR-DEMO高动态范围渲染

高手做的HDR渲染,包含很多有用的SHader.值得借鉴

DirectX9.0实现游戏DEMO

一个以DX9开始的3D游戏DEMO,使用了地形LOG管理、粒子、骨骼动画等多种3D游戏技术,适合对3D游戏设计有兴趣者参考。

Directx9 sdk中有用的例子-Demo说明

转自http://hi.baidu.com/lf460/item/f13775134d5f22affeded502 directx9sdk中有用的例 C:\DXSDK\Samples\C++\DirectShow\VMR9\VMR9Allocator\ 一个avi视频在三维空间中旋转、变换! C:\DXSDK\Samples\C++\DirectShow\C

sherry_0009的专栏 2467

用C#实现面向对象编程之继承和多态概念的示例程序

这是文章《面向对象编程之继承和多态》的配套示例程序。在学习面向对象编程时都学习到三个概念:封装、继承、多态。封装已经讲解过,可以翻一下本博客的发表记录。所谓的继承,就是父类已经实现的属性、方法等,子类也跟着有,无需重复实现。所谓的多态,就是父类只定义的属性、方法等的名称、数据类型、参数,具体由子类实现。

DirectX9 SDK Samples(20) HDRDemo Sample(2)

接下来进入第二部分,Bloom,SDK里称为post-processing effect。代码所在文件为PostProcess.cpp。 LPDIRECT3DTEXTURE9 g_pBrightPassTex = NULL; // The results of performing a bright pass on the original HDR imagery L

1056

ScreenInk 0.0.1.exe

ScreenInk 0.0.1.exe

外盘期货历史高频tick数据涵盖CME、ICE等交易所的主要品种,包含能源、贵金属、农产品、股指和外汇期货 数据字段有交易日期、精确到毫秒的时间、成交价格、成交量、持仓量以及买卖方向标识 部分品种还提

外盘期货历史高频tick数据涵盖CME、ICE等交易所的主要品种,包含能源、贵金属、农产品、股指和外汇期货。数据字段有交易日期、精确到毫秒的时间、成交价格、成交量、持仓量以及买卖方向标识。部分品种还提供盘口五档或十档挂单数据。所有数据按交易日压缩打包,解压后为CSV格式,便于直接读取分析。 数据源:CMES金融数据库

HDR视频完全解密

转自:http://www.icpcw.com/Parts/Peripheral/dnwspc/3271/327191.htm 技术总是在不断进步中,特别是针对我们的视觉体验,各个厂商都在不遗余力地开发着新技术来满足观众们的需求。在H.265、10bit、4K已经越来越难引起消费者关注的时候,HDR的横空出世,再一次引发了新一轮的图像话题。不夸张地说,在2016年,无论是平板电视、4K蓝

haima1998的专栏 1万+

三相PWM整流器双闭环控制仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了三相PWM整流器双闭环控制的Simulink仿真模型,重点实现电压外环与电流内环的协同控制策略,通过仿真验证系统在稳态与动态工况下的运行性能。模型涵盖主电路拓扑结构、PWM调制技术、坐标变换(如abc/dq变换)、PI控制器设计及双闭环控制逻辑的实现,能够实现单位功率因数运行、直流侧电压稳定控制以及网侧电流正弦化等目标。同时,文档进一步拓展至VOC(虚拟同步发电机控制)与SVPWM调制相结合的高级控制策略,提升了系统的动态响应能力与控制灵活性。; 适合人群:具备电力电子技术与电力系统基础知识,熟悉Simulink仿真环境的电气工程及相关专业的本科生、研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解三相PWM整流器的工作原理及其双闭环控制策略的设计方法;②掌握基于Simulink的电力电子系统建模、仿真与控制系统调试技术;③为后续研究电压源换流器(VSC)、虚拟同步控制(VOC)、微电网并网控制等先进电力电子控制技术奠定理论与实践基础。; 阅读建议:建议结合经典电力电子教材与本仿真模型同步学习,重点关注PI控制器参数整定、坐标变换模块的搭建逻辑以及系统稳定性分析方法,有条件者可进一步将仿真结果对接实际硬件平台进行实验验证,以深化对控制策略工程应用的理解。

DirectX9例程:绘制简单立方体

总结至红龙书提供的立方体绘制例程代码及重要函数:   d3dUtility.h #ifndef __d3dUtilityH__ #define __d3dUtilityH__ #include &lt;d3dx9.h&gt; namespace d3d { //初始化DirectX3D bool InitD3D( HINS...

stIck_NHNP的博客 5466

数据资产目录(SailCatalog)和数据地图(SailMap)

笔者接下来准备开发大数据平台(XSailboat)中的数据资产目录(SailCatalog)和数据地图(SailMap)相关的功能,本文用以记录笔者关于此部分功能的概念梳理和主体功能设计。

OkGogooXSailboat的博客 2326

1448•纯粹素数

纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。对于每一个数(无论质数合数)x,筛掉所有小于x最小质因子的质数乘以x的数。但我们知道,我们选择的那个质数必须小于那个合数的最小质因子。p3,因为p2>p1,所以这样是筛不到的。唯一会筛的是第一种:p1和p2*p3。c,s肯定小于刚才那个合数,说明肯定对于它已经筛过,然后a肯定小于s,因为s=b。p3,并且保证p1<p2<p3。我们知道,筛掉这个合数的机会有:p1和p2。c,并且a是最小的因子。

SSL_bin的博客 591
上一篇: DirectX9 SDK Samples(20) HDRDemo Sample(2)
下一篇: DirectX9 SDK Samples(21) HDRCubeMap Sample
HowdChow
博客等级 码龄15年 10粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值