DirectX9 SDK Samples(16) ShadowMap Sample(1)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

阴影映射,这是常用的技术了,具体技术解释就不说了,SDK中也有,还是阅读代码吧。

1OnResetDevice

    // Create the shadow map texture
    V_RETURN( pd3dDevice->CreateTexture( ShadowMap_SIZE, ShadowMap_SIZE,
                                         1, D3DUSAGE_RENDERTARGET,
                                         D3DFMT_R32F,
                                         D3DPOOL_DEFAULT,
                                         &g_pShadowMap,
                                         NULL ) );
创建阴影纹理。注意D3DUSAGE是RENDERTARGET,格式只有一个通道,因为只需要深度值。

    // Create the depth-stencil buffer to be used with the shadow map
    // We do this to ensure that the depth-stencil buffer is large
    // enough and has correct multisample type/quality when rendering
    // the shadow map.  The default depth-stencil buffer created during
    // device creation will not be large enough if the user resizes the
    // window to a very small size.  Furthermore, if the device is created
    // with multisampling, the default depth-stencil buffer will not
    // work with the shadow map texture because texture render targets
    // do not support multisample.
    DXUTDeviceSettings d3dSettings = DXUTGetDeviceSettings();
    V_RETURN( pd3dDevice->CreateDepthStencilSurface( ShadowMap_SIZE,
                                                     ShadowMap_SIZE,
                                                     d3dSettings.d3d9.pp.AutoDepthStencilFormat,
                                                     D3DMULTISAMPLE_NONE,
                                                     0,
                                                     TRUE,
                                                     &g_pDSShadow,
                                                     NULL ) );
这里还用到了模版来进行深度测试,使用原因见注释。
    // Initialize the shadow projection matrix
    D3DXMatrixPerspectiveFovLH( &g_mShadowProj, g_fLightFov, 1, 0.01f, 100.0f );
创建阴影图的透视矩阵。


2OnFrameRender

    //
    // Render the shadow map
    //
    LPDIRECT3DSURFACE9 pOldRT = NULL;
    V( pd3dDevice->GetRenderTarget( 0, &pOldRT ) );
    LPDIRECT3DSURFACE9 pShadowSurf;
    if( SUCCEEDED( g_pShadowMap->GetSurfaceLevel( 0, &pShadowSurf ) ) )
    {
        pd3dDevice->SetRenderTarget( 0, pShadowSurf );
        SAFE_RELEASE( pShadowSurf );
    }
    LPDIRECT3DSURFACE9 pOldDS = NULL;
    if( SUCCEEDED( pd3dDevice->GetDepthStencilSurface( &pOldDS ) ) )
        pd3dDevice->SetDepthStencilSurface( g_pDSShadow );

    {
        CDXUTPerfEventGenerator g( DXUT_PERFEVENTCOLOR, L"Shadow Map" );
        RenderScene( pd3dDevice, true, fElapsedTime, &mLightView, &g_mShadowProj );
    }

    if( pOldDS )
    {
        pd3dDevice->SetDepthStencilSurface( pOldDS );
        pOldDS->Release();
    }
    pd3dDevice->SetRenderTarget( 0, pOldRT );
    SAFE_RELEASE( pOldRT );
这一段代码涉及到RenderTarget和DepthStencil的改变。改变RT和DS后,调用RenderScene渲染ShadowMap。
    //
    // Now that we have the shadow map, render the scene.
    //
    const D3DXMATRIX* pmView = g_bCameraPerspective ? g_VCamera.GetViewMatrix() :
        &mLightView;

    // Initialize required parameter
    V( g_pEffect->SetTexture( "g_txShadow", g_pShadowMap ) );
    // Compute the matrix to transform from view space to
    // light projection space.  This consists of
    // the inverse of view matrix * view matrix of light * light projection matrix
    D3DXMATRIXA16 mViewToLightProj;
    mViewToLightProj = *pmView;
    D3DXMatrixInverse( &mViewToLightProj, NULL, &mViewToLightProj );
    D3DXMatrixMultiply( &mViewToLightProj, &mViewToLightProj, &mLightView );
    D3DXMatrixMultiply( &mViewToLightProj, &mViewToLightProj, &g_mShadowProj );
    V( g_pEffect->SetMatrix( "g_mViewToLightProj", &mViewToLightProj ) );
    CDXUTPerfEventGenerator g( DXUT_PERFEVENTCOLOR, L"Scene" );
    RenderScene( pd3dDevice, false, fElapsedTime, pmView, g_VCamera.GetProjMatrix() );

上一段代码渲染好了阴影图,那么这一段代码就是利用阴影图渲染场景。

3RenderScene

    if( bRenderShadow )
        V( g_pEffect->SetTechnique( "RenderShadow" ) );

    // Begin the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
        if( !bRenderShadow )
            V( g_pEffect->SetTechnique( "RenderScene" ) );
注意,这里的代码写得有点不清楚,对比两个if语句,我们可以得知,要不渲染阴影,要不渲染场景。

下面还有渲染灯光的,就省略了。下一节分析着色器。




DirectX11-Sample-Tutorial01-初始化窗口-利用d3d清除窗口背景颜色 1)按照这里的方法配置好DirectX11 2)流程简介 >首先,要初始化窗口,用于显示图形图像。 >其次,创建图形模型(InitModel),如一个三角片,由三个顶点组成,每个顶点有对应的颜色或纹理;然后,创建着色器(InitShader),包括顶点着色器和像素着色器,用于将模型与GPU关联,将模型放入渲染管道线中处理。 >然后,利用Windows的消息循环机制,不断接收 阅读详情

相关推荐

DirectX9 SDK 下载、安装、VC++开发环境配置、跑通第一个例子

一 可在 http://download.microsoft.com/download/F/1/7/F178BCE4-FA19-428F-BB60-F3DEE1130BFA/DXSDK_Feb10.exe 下载   也可在我的网盘下载: http://pan.baidu.com/s/1pJmMLHh   双击DXSDK_Feb10.exe进行安装,   协议,

bcbobo21cn的专栏 1万+

D3D9 SDK 易语言

易语言的D3D9 SDK DLL支持库易语言的D3D9 SDK DLL支持库

DirectX9阴影映射实例

阴影映射,DirectX,Shadow,书本源码,很不错,VS下调试通过!

DirectX SDKSamples遇到的问题

在安装Direct SDK选择安装路径时,如果选择默认路径,那么,打开例程可以直接运行。如果选择其他路径,就需要在工程属性中设置包含目录Include和库目录Lib/x86(x64)如果提示无法解析的外部符号,解决方法:https://blog.csdn.net/just0kk/article/details/51583218...

wanglantian1的博客 446

DirectX SDK下载安装及开发环境设置

DirectX(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口,是一种应用程序接口(API)。DirectX可以让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3D图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。——

hangl_ciom的博客 1万+

第二章 DirectX 基础(上)

首先,我们需要下载DirectXSDK包,并安装到本地电脑上。 Download DirectX SDK from Official Microsoft Download Center 从Windows 8操作系统开始,DirectX SDK已经集成到Windows SDK了,不需要单独安装!安装Visual Studio的时候勾上Windows SDK即可!也就是说我们刚刚下载的只适用于Windows XP, Windows 7系统。这个DXSDK_Jun10已经包含了9,10,11三个版.

konkon2012的博客 2529

Directx 9shadowmap 的解析

1.  ShadowMap原理:    首先准备一张纹理贴图,和一个深度模版。 准备深度模版的作用是为了进行深度测试,使得纹理贴图只用记录每个像素深度最小的值。 1:.将世界坐标系下的顶点转换到光源视点下,再投影,最后渲染一遍场景,得到一张带深度缓冲区的纹理贴图(以纹理贴图为渲染目标),但是纹理贴图中的记录的不是颜色值,而是深度值,由于使用了深度测试模版所以该贴图里得到的深度值是每个

Neversaydie_D的专栏 1359

DirectX9 SDK Samples(16) ShadowMap Sample(2)

这一节阅读FX文件。阅读顺序基本和程序执行情况一致。 首先执行的是渲染阴影图。 //----------------------------------------------------------------------------- // Technique: RenderShadow // Desc: Renders the shadow map //-----------------

817

C++directx基本模板完整代码

C++directx基本模板完整代码

Solitairs的博客 823

DirectX11学习笔记九 平面阴影 简易代码框架

本来说这节打算自己搞一个D3D框架的,但是跟了外网的教程走了半个月后发现Chili的框架对于我这种初学者而言太过于事无巨细,如果只想学习d3d api以及用其要达到什么效果的话,有些“重量级”,所以我打算两手抓了,相比沉浸在c++新特性和指针、泛型里,我相信龙书的教程更有指向性。拿龙书与Chili的教程相互比较学习,还是不错的,有了Chili的基础,再看龙书的代码感觉就快多了。 ...

MaxLykoS的博客 484

DirectX 9.0 C++ 教程 开发环境设定

1.开发工具 我一般使用Visual C++ 6.0来编译和调试DirectX,比较轻量级。 也可以用VS2005 或 VS2010。推荐使用Visual C++ 6.0时安装Visual Assist X。这样Visual C++ 6.0下代码提示会好些。 2.安装 DirectX 9.0 玩游戏的话是安装个DirectX 9.0 软件。这里我们开发要安装DirectX 9.0 SDK。下

易水寒 1万+

D3D9SDK开发引用库

该压缩包内只含有从完整SDK中分离出来的Developer Runtime文件和Include头文件和Lib链接库,而不需要下载完整的SDK安装包

D3D9 SDK文档笔记3---一切从头开始(2)

    先给一个粗粗的流程,让初学者解开萦绕在心底的谜团。    基本上每一本图形的书,在讲述3D的渲染流程时,无不从顶点及其变换等讲起,直到输出屏幕像素。大家看得多了可能也腻了。这里,不妨换一个角度从最后显示在屏幕上的像素讲起。既然要讲屏幕像素,就跑不掉先要唠叨下屏幕坐标系了,我们从小屁孩开始学起的坐标系,其实说白了就是一个参照系统,有了这个参照系,我们就可以将物体的相对位置搞得很清楚了

okdou的专栏 1064

性能优化:(From D3D9 SDK

性能优化:(From D3D9 SDK) 常规技巧1 只在必须的时候Clear。   IDirect3DDevice9::Clear函数通常需要花费较多的时间,因此要尽量少调用,而且只清空的确需要清空的缓存。2 尽量减少状态切换。并且将需要进行的状态切换组合在一起设置。   状态包括RenderState,SamplerState,TextureStageState等3 纹理尺寸尽可能小4 从

cglover的专栏 1458

一个DirectXSample引发的学习(1

  这个例子描述了怎么使用D3DX的SHPRTSimulation,一个per vertex precomputed radiance transfer (PRT)的simulator。使用了low-order spherical harmonics (SH)并把结果记录到文件中。然后描述了怎么使用 clustered principal component analysis (CPCA)

NetGhost的专栏 2443

ShadowMap DX9

ShadowMap基本的思想很简单,首先从聚光灯角度对场景建立并保存场景深度。然后在正常渲染场景中,比较每个渲染点到灯的距离值(或者说到灯的深度值)是否比对应的已经建立在场景深度中的值要大,也就是说要远,如果远证明从当前视点观察的此点在灯角度中看不见,所以该渲染点处于阴影中,否则,不然。   首先分析一下ShadowMap的优劣: 优点: ShadowMap只适合较近距离的阴影投射,由于3

xujiezhige的专栏 1617

DirectX9 SDK Samples(17) StateManager Sample

在渲染不同的材质中,我们往往需要设置不同的状态。其中一种办法是在每一个FX文件中最后添加一个PASS,把状态设置回原来的默认值。另一个方法就是本次例子所用到的,使用ID3DXEffectStateManager。 OnRenderState内调用SortRenderables对可渲染对象进行排序。 void SortRenderables() { if( g_bSortOrderD

893

D3D9 SDK文档笔记2---一切从头开始(1)

   玩过Directx开发的人都知道,Directx是基于COM(组件对象模型)的。据本人理解,COM本质上就是在windows注册表里登记入户的一些接口---函数的集合,给每个COM一个身份证号(GUID)。这样通过在注册表中查找身份证号,每个应用程序都可以方便的调用这些接口。同时为了保证这些接口的通用性,以便各种不同的编程语言都可以方便调用,在编写COM时,就必须遵循一个公共的标准。而在一台

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值