实时3D地形引擎——Chapter6_02——D3DApp框架阅读1

实时3D地形引擎——Chapter6_01——初读 坑已经开几天了,就从今天开始吧。书的第六章只有一个例子,而且不长,但实际上这个例子用到的框架也需要阅读,所以估计也要看很久。 class cMyHost:public cGameHost { public: cMyHost(){}; ~cMyHost(){}; HRESULT InitDeviceObjects(); HRESULT RestoreDeviceObjects(); 阅读详情

下面就是入口点,这一次我们将从入口点开始分析一下D3DApp框架的运行过程。

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point to the program. Initializes everything, and goes into a
//       message-processing loop. Idle time is used to render the scene.
//-----------------------------------------------------------------------------
INT WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
	cMyHost d3dApp;

	srand(timeGetTime());

	//  InitCommonControls();
	if (FAILED (d3dApp.Create (hInst)))
	 return 0;

	INT result= d3dApp.Run();

	cCodeTimer::RootTimer.outputAllTimers(0xffffffff);

	return result;
}

第一句就是新建了一个cMyHost对象d3dApp。而cMyHost的构造函数是空的,主要是在父类中做参数的初始化。

那么下一句就是d3dApp.Create(hInst)了。

HRESULT CD3DApplication::Create( HINSTANCE hInstance )
{
    HRESULT hr;

    // Create the Direct3D object
    m_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
    if( m_pD3D == NULL )
        return DisplayErrorMsg( D3DAPPERR_NODIRECT3D, MSGERR_APPMUSTEXIT );

    // Build a list of Direct3D adapters, modes and devices. The
    // ConfirmDevice() callback is used to confirm that only devices that
    // meet the app's requirements are considered.
    m_d3dEnumeration.SetD3D( m_pD3D );
    m_d3dEnumeration.ConfirmDeviceCallback = ConfirmDeviceHelper;
    if( FAILED( hr = m_d3dEnumeration.Enumerate() ) )
    {
        SAFE_RELEASE( m_pD3D );
        return DisplayErrorMsg( hr, MSGERR_APPMUSTEXIT );
    }

    // Unless a substitute hWnd has been specified, create a window to
    // render into
    if( m_hWnd == NULL)
    {
        // Register the windows class
        WNDCLASS wndClass = { 0, WndProc, 0, 0, hInstance,
                              LoadIcon( hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON) ),
                              LoadCursor( NULL, IDC_ARROW ),
                              (HBRUSH)GetStockObject(WHITE_BRUSH),
                              NULL, _T("D3D Window") };
        RegisterClass( &wndClass );

        // Set the window's initial style
        m_dwWindowStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | 
                          WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE;

        // Set the window's initial width
        RECT rc;
        SetRect( &rc, 0, 0, m_dwCreationWidth, m_dwCreationHeight );
        AdjustWindowRect( &rc, m_dwWindowStyle, true );

        // Create the render window
        m_hWnd = CreateWindow( _T("D3D Window"), m_strWindowTitle, m_dwWindowStyle,
                               CW_USEDEFAULT, CW_USEDEFAULT,
                               (rc.right-rc.left), (rc.bottom-rc.top), 0,
                               LoadMenu( hInstance, MAKEINTRESOURCE(IDR_MENU) ),
                               hInstance, 0 );
    }

    // The focus window can be a specified to be a different window than the
    // device window.  If not, use the device window as the focus window.
    if( m_hWndFocus == NULL )
        m_hWndFocus = m_hWnd;

    // Save window properties
    m_dwWindowStyle = GetWindowLong( m_hWnd, GWL_STYLE );
    GetWindowRect( m_hWnd, &m_rcWindowBounds );
    GetClientRect( m_hWnd, &m_rcWindowClient );

    if( FAILED( hr = ChooseInitialD3DSettings() ) )
    {
        SAFE_RELEASE( m_pD3D );
        return DisplayErrorMsg( hr, MSGERR_APPMUSTEXIT );
    }

    // Initialize the application timer
    DXUtil_Timer( TIMER_START );

    // Initialize the app's custom scene stuff
    if( FAILED( hr = OneTimeSceneInit() ) )
    {
        SAFE_RELEASE( m_pD3D );
        return DisplayErrorMsg( hr, MSGERR_APPMUSTEXIT );
    }

    // Initialize the 3D environment for the app
    if( FAILED( hr = Initialize3DEnvironment() ) )
    {
        SAFE_RELEASE( m_pD3D );
        return DisplayErrorMsg( hr, MSGERR_APPMUSTEXIT );
    }

    // The app is ready to go
    Pause( false );

    return S_OK;
}

代码的注释非常详细,不过DX9初始化感觉有点麻烦。

1.ChooseInitialD3DSettings函数主要完成的功能是设置全屏和窗口模式。

2.DXUtil_Timer用来设置时间,这个函数可以用来完成有关时间的操作。

3.在D3DApp框架中,OneTimeSceneInit函数基本没用,需要子类重写来完成所需要的初始化。这一篇主要还是以D3DApp为主,因此就不看cGameHost的实现了。

4.Initialize3DEnvironment,初始化3D环境,完成的就是创建设备这类DX9初始化必需的步骤。


再次回到入口点函数,下一句就是d3dApp.Run()。这一次我们依然只看D3DApp中完成的事。

INT CD3DApplication::Run()
{
    // Load keyboard accelerators
    HACCEL hAccel = LoadAccelerators( NULL, MAKEINTRESOURCE(IDR_MAIN_ACCEL) );

    // Now we're ready to recieve and process Windows messages.
    bool bGotMsg;
    MSG  msg;
    msg.message = WM_NULL;
    PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );

    while( WM_QUIT != msg.message  )
    {
        // Use PeekMessage() if the app is active, so we can use idle time to
        // render the scene. Else, use GetMessage() to avoid eating CPU time.
        if( m_bActive )
            bGotMsg = ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) != 0 );
        else
            bGotMsg = ( GetMessage( &msg, NULL, 0U, 0U ) != 0 );

        if( bGotMsg )
        {
            // Translate and dispatch the message
            if( hAccel == NULL || m_hWnd == NULL || 
                0 == TranslateAccelerator( m_hWnd, hAccel, &msg ) )
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
        }
        else
        {
            if( m_bDeviceLost )
            {
                // Yield some CPU time to other processes
                Sleep( 100 ); // 100 milliseconds
            }
            // Render a frame during idle time (no messages are waiting)
            if( m_bActive )
            {
                if( FAILED( Render3DEnvironment() ) )
                    SendMessage( m_hWnd, WM_CLOSE, 0, 0 );
            }
        }
    }
    if( hAccel != NULL )
        DestroyAcceleratorTable( hAccel );

    return (INT)msg.wParam;
}

这就是消息处理了,直到程序退出。消息处理其中一个重要地方在于渲染。

HRESULT CD3DApplication::Render3DEnvironment()
{
    HRESULT hr;

    if( m_bDeviceLost )
    {
        // Test the cooperative level to see if it's okay to render
        if( FAILED( hr = m_pd3dDevice->TestCooperativeLevel() ) )
        {
            // If the device was lost, do not render until we get it back
            if( D3DERR_DEVICELOST == hr )
                return S_OK;

            // Check if the device needs to be reset.
            if( D3DERR_DEVICENOTRESET == hr )
            {
                // If we are windowed, read the desktop mode and use the same format for
                // the back buffer
                if( m_bWindowed )
                {
                    D3DAdapterInfo* pAdapterInfo = m_d3dSettings.PAdapterInfo();
                    m_pD3D->GetAdapterDisplayMode( pAdapterInfo->AdapterOrdinal, &m_d3dSettings.Windowed_DisplayMode );
                    m_d3dpp.BackBufferFormat = m_d3dSettings.Windowed_DisplayMode.Format;
                }

                if( FAILED( hr = Reset3DEnvironment() ) )
                    return hr;
            }
            return hr;
        }
        m_bDeviceLost = false;
    }

    // Get the app's time, in seconds. Skip rendering if no time elapsed
    FLOAT fAppTime        = DXUtil_Timer( TIMER_GETAPPTIME );
    FLOAT fElapsedAppTime = DXUtil_Timer( TIMER_GETELAPSEDTIME );
    if( ( 0.0f == fElapsedAppTime ) && m_bFrameMoving )
        return S_OK;

    // FrameMove (animate) the scene
    if( m_bFrameMoving || m_bSingleStep )
    {
        // Store the time for the app
        m_fTime        = fAppTime;
        m_fElapsedTime = fElapsedAppTime;

        // Frame move the scene
        if( FAILED( hr = FrameMove() ) )
            return hr;

        m_bSingleStep = false;
    }

    // Render the scene as normal
    if( FAILED( hr = Render() ) )
        return hr;

    UpdateStats();

    // Show the frame on the primary surface.
    hr = m_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    if( D3DERR_DEVICELOST == hr )
        m_bDeviceLost = true;

    return S_OK;
}

第一部分是处理设备丢失的情况,老实说我到底也没弄清楚设备丢失是怎么个情况,貌似切换屏幕会导致设备丢失。不过丢失了就要重新设置有关窗口的设置。调用了下面的重置函数。
HRESULT CD3DApplication::Reset3DEnvironment()
{
    HRESULT hr;

    // Release all vidmem objects
    if( m_bDeviceObjectsRestored )
    {
        m_bDeviceObjectsRestored = false;
        InvalidateDeviceObjects();
    }
    // Reset the device
    if( FAILED( hr = m_pd3dDevice->Reset( &m_d3dpp ) ) )
        return hr;

    // Store render target surface desc
    LPDIRECT3DSURFACE9 pBackBuffer;
    m_pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
    pBackBuffer->GetDesc( &m_d3dsdBackBuffer );
    pBackBuffer->Release();

    // Set up the fullscreen cursor
    if( m_bShowCursorWhenFullscreen && !m_bWindowed )
    {
        HCURSOR hCursor;
#ifdef _WIN64
        hCursor = (HCURSOR)GetClassLongPtr( m_hWnd, GCLP_HCURSOR );
#else
        hCursor = (HCURSOR)ULongToHandle( GetClassLong( m_hWnd, GCL_HCURSOR ) );
#endif
        D3DUtil_SetDeviceCursor( m_pd3dDevice, hCursor, true );
        m_pd3dDevice->ShowCursor( true );
    }

    // Confine cursor to fullscreen window
    if( m_bClipCursorWhenFullscreen )
    {
        if (!m_bWindowed )
        {
            RECT rcWindow;
            GetWindowRect( m_hWnd, &rcWindow );
            ClipCursor( &rcWindow );
        }
        else
        {
            ClipCursor( NULL );
        }
    }

    // Initialize the app's device-dependent objects
    hr = RestoreDeviceObjects();
    if( FAILED(hr) )
    {
        InvalidateDeviceObjects();
        return hr;
    }
    m_bDeviceObjectsRestored = true;

    // If the app is paused, trigger the rendering of the current frame
    if( false == m_bFrameMoving )
    {
        m_bSingleStep = true;
        DXUtil_Timer( TIMER_START );
        DXUtil_Timer( TIMER_STOP );
    }

    return S_OK;
}
这个函数就没有什么好说的了,里面调用的好几个函数都需要子类重写,但基本上功能就是这样了。

Render3DEnvironment剩下的部分就是子类主要工作了,重写渲染场景和更新数据的函数。

那么D3DApp框架的阅读就到此结束。老实说,我觉得D3DApp的条理性比DXUT的要好,为什么要换成以重写回调函数来完成功能的DXUT呢,实在不懂。下一篇,cGameHost类的阅读。

3D引擎:Horde3D:App类 Horde3D引擎 主要位于 Horde3D/Source/Horde3DEngine/Debug/下的 Horde3D.lib。 其源码位于Horde3D/Bindings/C++/Horde3D.h和 Horde3D/Source/Horde3DEngine/下的cpp文件里 Horde3D引擎资源的加载API 主要是 位于Horde/Source/Horde3DEngine/D 阅读详情

相关推荐

Opengl三维地形引擎Demo

这是一个很初级的三维地图演示,其中还没有加上光照处理,地形跟踪算法。等等。

实时3D地形引擎——Chapter6_04——GameHost框架阅读

距上一篇博文已经很久了,倒不是悠闲地过了两三星期,过去的这段时间都满课,而且我认为前面的章节没有看好看仔细,因此回去看了,把讲解过的源码都看了一次。好了,闲话不说了。         这篇博文标题是GameHost框架阅读,但实际上是结合了第六章中cMyHost的源码来阅读的。cGameHost对CD3DApplication类中的重要函数进行了重写,而cMyHost也对cGameHost的函数

777

实时地形引擎 完全版,有目录

实时地形引擎 完全版,有目录。 感觉很棒的一个教程,大家多下载,下载完回复就不用扣分了。 大家多顶一顶吧

Introduction to 3D Game Programming with DirectX 11 学习笔记 (2)D3DApp 类

D3DApp 是一个框架类,用于创建主窗口,创建 Direct3D 对象,并处理主循环逻辑。 源文件 ${CODE}/d3dApp.h ${CODE}/d3dApp.cpp 类方法详解 HINSTANCE D3DApp::AppInst() 返回当前应用的实例句柄。该值在 D3DApp 的构造函数中传入并保存。一般在创建唯一的 D3DApp 实例时,将 WinMain 函数的 h...

icbm的专栏 657

从真题到策略:浙江工业大学计算机转专业机试全解析与备考指南

本文全面解析浙江工业大学计算机转专业机试的考试概况、典型真题和高频考点,提供详细的备考策略和面试准备建议。从机试题目类型到解题技巧,帮助考生高效备考,顺利通过这一竞争激烈的转专业关卡。

weixin_42524824的博客 419

Circos在Windows下的安装教程

这里写自定义目录标题Circos简介安装Perl 的安装Circos安装安装及解压安装Modules测试用例官方文档 Circos简介 (来源官网:http://circos.ca/software/readme/ O.INTRODUCTION部分) Circos is a program for the generation of publication-quality, circularly composited renditions of genomic data and related annot

qq_42318911的博客 1660

Directx--初始化操作

一.建立 D3DAPP 头文件及cpp文件 文件创建后,构造D3D类并转运原来main中的代码 构造D3D类: #include<windows.h> class D3DAPP { public: D3DAPP(HINSTANCE hInst); LRESULT MsgProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam); bool InitWnd(); bool InitD3D(); bool Init(); prot

weixin_62773441的博客 1429

Shell数学计算(算术运算,加减乘除运算)

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。 参考博客 : 原文链接:http://c.biancheng.net/shell/ Shell数学计算Shell数学计算数学计算命令对整数进行数学运算: (()) / let / $[] /exprShell (())Shell let命令bc命令:一款数学计算器在 Shell 中使用 bc 计算器 Shell数学计算 默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数

AKUANer的博客 2万+

实时3D地形引擎开坑

实时3D地形引擎这本书由承天一大哥翻译,翻了翻,感觉不错,虽然貌似因为写得简略而有点难懂。这么好的书,假如翻翻就算了的话,实在太浪费了,所以还是在优快云上开个坑写一下自己看源码的过程吧,呵呵。上一篇博文是5个月前写的,这5个月过去了,感觉没什么进步。现在去向已经定了,不用纠结了,必须好好自学一下了。         这个系列将会以这本书的例子为主展开描述,估计主要写我是怎么样看代码的。好,今天

1768

单细胞实战之数据净化三部曲:细胞周期校正、双胞体剔除与RNA污染清理——技术解析与实战指南

本文深入解析单细胞数据分析中至关重要的数据净化步骤,即细胞周期校正、双胞体剔除与RNA污染清理。通过实战代码演示与原理剖析,指导读者如何有效识别并去除技术噪音,从而获得更纯净、可靠的数据,为后续的细胞分群、差异表达等高级分析奠定坚实基础。

weixin_29274337的博客 204

World Action Model:经典论文

郑困时,图prorpt为机量人压务时,退过驱制解弱词表(constrsinsd decoding), 强附模型只从.256个者动作token中保H, B象总注活地。始VLA之一,RT-2使用了大量的五联网VQ据与少里的机械网的AcSonDat行CoFine-Tunng, 独组sl, 共i744个episode,Mous使用三个专累模,分是vidogonmedel,actonesget,understandng。包的核定之的的观到沟血黄动作,预之后现(vorlemodel),tseing,2。

u013250861的博客 406

实时3D地形引擎——Chapter6_03——D3DApp框架阅读2

上一篇根据函数的执行过程将D3DApp框架的主要函数看了一遍,不过后来发现漏了一个非常重要的地方,就是消息处理。这个框架的消息处理函数为WndProc,写得非常完备,特别是在窗口缩放和全屏等地方。那么对于我们来说,其实最重要的地方就是处理WM_PAINT时调用Render函数进行渲染。 下面是D3DApp框架自带的描述: //----------------------------------

791

实战解析:基于Python的APT攻击检测与ATT&CK框架应用

本文通过实战案例,详细解析了如何利用Python编程语言结合MITRE ATT&CK框架,构建一套针对高级持续性威胁(APT)的自动化检测与狩猎系统。文章涵盖了从环境搭建、核心检测逻辑编写、到模块化框架设计与主动威胁狩猎的全过程,为安全从业者提供了可落地的技术方案,以有效应对复杂的网络攻击。

weixin_29044157的博客 388

Directx11学习笔记【八】 龙书D3DApp的实现

Directx11学习笔记【八】 龙书D3DApp的实现 原文:Directx11学习笔记【八】 龙书D3DApp的实现directx11龙书中的初始化程序D3DApp跟我们上次写的初始化程序大体一致,只是包含了计时器的内容,而且使用了深度模板缓冲。 D3DUtil类,定义了一些工具和宏,目前只定义了两个宏,以后还会添加 #ifn...

weixin_30384217的博客 584

人形机器人专题:人形机器人关节,从Optimus选型看关节的发展

今天分享的是深度研究报告:《(报告出品方:中泰页。

GPT20236688的博客 3223

2023西工大NOJ (C语言版) 完结!!!

代码均可AC,不含解析。

annesede的博客 8万+

D3D9-hello world

作者:lhqsine 一、搭建《DIRECTX.9.0.3D游戏开发编程基础》开发环境与第一个程序 1、下载directX库 vs2012以后的版本都集成了基本的directx库,所以如果不需要用到directx3D的扩展库(例如d3dx8~11.lib),则可以直接使用。但是龙书中则用到了d3dx9.lib库,因此还是需要下载微软的DirectX Software Develo

山水人间。 1059

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Unity3D地形引擎指南

This section will explain how to use the Terrain Engine. It will cover creation, technical details, and other considerations. It is broken into the following sections: 本节将说明如何使用地形引擎。它将涵盖创建、技术细节、和其他

LazyChun的专栏 2099

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

探索创新:Runtime Terrain Editor - 实时地形编辑器

探索创新:Runtime Terrain Editor - 实时地形编辑器 去发现同类优质开源项目:https://gitcode.com/ 在游戏开发和虚拟环境构建中,逼真的地形生成是一个至关重要的环节。 是一个独特且强大的工具,它允许开发者在运行时创建、编辑和控制3D地形。这项技术改变了传统地形编辑的工作流程,为实时场景提供了无限可能。 项目简介 Runtime Terrain Editor ...

gitblog_00032的博客 562

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Alpha 闪烁效果

Philip Taylor 2000年9月 下载本文的源代码 (521 KB) 欢迎阅读 Driving DirectX。这个月,我将通过开发一个使用 alpha 的 Direct3D 屏幕保护程序继续对 alpha 混色进行探索。 图 1. MSDNSparkles 屏幕快照图 1 显示了该示例的一个屏幕快照;要想真正欣赏这些图像,您必须花上一定的时间来观察屏幕保护程序的形态

蝈蝈俊.net 1863

Direct3D的初始化

dx初始化

寂蝶难双,窃窃思羽. 804

分布式渲染运行时3D引擎架构在Web端的应用: 秒开3D Web APP

分布式渲染运行时3D引擎架构在Web端的应用: 秒开3D Web APP 页面,更广范围内的协同

vily_lei的专栏 1900

《Real Time 3D Terrain Engines Using C++ And DirectX9》(实时地形引擎)随书源码

《Real Time 3D Terrain Engines Using CplusplusAnd DirectX9》(实时地形引擎)随书源码,gaia引擎源码下载:http://ishare.iask.sina.com.cn/f/23556371.html

weixin_34307464的博客 305

DirectX11 演示程序框架

演示程序框架 本书中的演示程序均使用d3dUtil.h、d3dApp.h、d3dApp.cpp文件中的代码,这些文件可以从本书网站下载。由于本书的第Ⅱ部分和第Ⅲ部分的所有演示程序都会用到些常用文件,所以我们把些文件保存在了Common目录下,使些文件被所有的工程共享,避免多次复制文件。d3dUtil.h文件包含了一些有用的工具代码,d3dApp.h和d3dApp.cpp文件包含了Direct3D

梦幻DUO的游戏开发之路 3152

第一人称游戏技术 - 实现在高低不平的3D地形上行走效果

在高低不平的3D地图上行走比在平面上行走要困难很多,因为y轴的高度要随着地形不同而变化,要想让镜头固定在地面上某一高度,模拟人在上面走的感觉就牵涉到很多技术. 下面看看效果图如何: 下面看看其中的关键技术是什么。 原创地址:作者:靖心 靖空间 1 取得高度图的高度 要定义一个可以行走在高低不平的地图上的Camera,首先需要定义一个函数getHeight(x,z),取得地...

20386053 511
上一篇: 实时3D地形引擎——Chapter6_01——初读
下一篇: 实时3D地形引擎——Chapter6_03——D3DApp框架阅读2
HowdChow
博客等级 码龄15年 10粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值