`

Direct3D入门:二、Direct3D程序基本结构和最简单的Direct3D程序

阅读更多
http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
Direct3D程序的基本结构为:

1、创建一个Windows窗口;
2、初始化Direct3D;
3、消息循环;
4、渲染图形;
5、结束Direct3D程序;

下面我们建立一个最简单的Direct3D程序。
我们用VC++2005进行开发,进入VC++2005,选【文件】》【新建】》【项目】,



在弹出的菜单中选 Visual C++项目中的Win32项目,工程起名为CreateDevice,如图:


按确定,进入Win32应用程序设置向导。
选中【应用程序设置】》【空项目】


这样我们就建立一个Win32项目框架。
下面我们就给项目添加运行文件。
在项目名称上单击右键,选择【添加】》【新建项】



选Visual C++项》c++文件(.cpp)文件,文件起名为CreateDevice。


这样我们就为项目添加了一个CPP源文件。我们在【源文件】目录就看到多出了一个CreateDevice.cpp的文件。
如图


下面我们就可以编辑CreateDevice.cpp文件,添加代码了。
//=============================================================================
// Desc: 最简单的Direct3D程序, 
//=============================================================================

#include <d3d9.h>


//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D       = NULL; //Direct3D对象
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; //Direct3D设备对象


//-----------------------------------------------------------------------------
// Desc: 初始化Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
	//创建Direct3D对象, 该对象用来创建Direct3D设备对象
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

	//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

	//创建Direct3D设备对象
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

   return S_OK;
}


//-----------------------------------------------------------------------------
// Desc: 释放创建对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
	//释放Direct3D设备对象
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();

	//释放Direct3D对象
    if( g_pD3D != NULL)
        g_pD3D->Release();
}


//-----------------------------------------------------------------------------
// Desc: 渲染图形
//-----------------------------------------------------------------------------
VOID Render()
{
    //清空后台缓冲区
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 );
    
    //开始在后台缓冲区绘制图形
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        //在此在后台缓冲区绘制图形
    
        //结束在后台缓冲区渲染图形
        g_pd3dDevice->EndScene();
    }

    //将在后台缓冲区绘制的图形提交到前台缓冲区显示
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}


//-----------------------------------------------------------------------------
// Desc: 消息处理
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}


//-----------------------------------------------------------------------------
// Desc: 程序入口
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    //注册窗口类
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"ClassName", NULL };
    RegisterClassEx( &wc );

    //创建窗口
    HWND hWnd = CreateWindow( L"ClassName", L"最简单的Direct3D程序", 
                              WS_OVERLAPPEDWINDOW, 200, 100, 600, 500,
                              NULL, NULL, wc.hInstance, NULL );

    //初始化Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    { 
        //显示主窗口
		ShowWindow( hWnd, SW_SHOWDEFAULT );
		UpdateWindow( hWnd );

		//进入消息循环
		MSG msg;
		ZeroMemory( &msg, sizeof(msg) );
		while( msg.message!=WM_QUIT )
		{
			if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
			{
				TranslateMessage( &msg );
				DispatchMessage( &msg );
			}
			else
			{
				Render();  //渲染图形
			}
		}
    }

    UnregisterClass( L"ClassName", wc.hInstance );
    return 0;
}


但是执行的时候出问题了,我们还需要做下面两个设置:
单击项目名称,右键,选项目属性,进入【连接器】》【输入】》【附加依赖项】后面输入:
d3d9.lib,连接到Direct3D的库;
另外一个操作是
【连接器】》【系统】》【子系统】改为:Windows。
可以解决这个问题:

error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 LIBCMT.lib
这个错误怎么解决



这个错误的解决方法,工程属性,---》连接器===》系统 ---》子系统=--》改成windows



错误的原因一般是在控制台的程序中使用了windows.h这个头文件,或者mfc相关的类库,因为vc程序编译的时候,c runtime链接的库是不同的,入口函数不同,库的实现也有不同,所以会造成链接的错误。


#define WINAPI __stdcall

感谢:http://hi.baidu.com/oday/blog/item/fb3806e90a85f738b80e2dd0.html
运行结果为:


http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350







  • 大小: 16.4 KB
  • 大小: 84.5 KB
  • 大小: 30 KB
  • 大小: 16.3 KB
  • 大小: 36.4 KB
  • 大小: 38.8 KB
  • 大小: 71.5 KB
  • 大小: 12.2 KB
  • 大小: 13.4 KB
分享到:
评论

相关推荐

    Direct3D游戏编程入门教程

    在第一部分,本书详细介绍了Direct3D的发展历史和基本知识,包括对3D程序设计中的一些基础术语和概念进行了深入的讲解。这部分内容对于初学者尤其重要,因为它帮助他们建立对Direct3D编程的整体认识,并理解3D图形...

    VC6 Direct3D 最简单的D3D程序

    这个最简单的D3D程序可能是初学者入门的起点,帮助理解Direct3D的基本概念和编程模型。 首先,我们需要了解Direct3D的核心概念。Direct3D提供了一种方式,让程序员可以与计算机的图形硬件进行交互,以提高图形渲染...

    Direct3D入门之框架的搭建

    本文将从零开始介绍如何构建一个简单的Direct3D应用程序,避免直接使用SDK示例中的`CD3DApplication`类带来的困惑,帮助读者更好地理解Direct3D的核心概念。 #### 二、Win32 SDK框架 在深入Direct3D之前,我们需要...

    Direct3D游戏编程入门教程.pdf

    本书基于DirectX 9.0编写,旨在向有一定DirectX基础的C++程序员介绍Direct3D游戏开发的基本知识和3D程序设计的相关概念与技术。本教程内容全面,分为四个部分,分别介绍了Direct3D的发展历史和基础概念、纹理映射...

    Direct3D游戏编程入门教程(第二版)

    Direct3D游戏编程入门教程(第二版)是一本专为初学者设计的教程,旨在引导读者进入激动人心的游戏开发世界。教程围绕微软的DirectX SDK展开,这是一个强大的工具集,主要用于开发图形密集型应用程序,尤其是游戏。...

    direct3D入门.pdf

    ### Direct3D 入门详解 #### 创建 Device 类实例 在深入探讨 Direct3D 的具体应用之前,我们先从创建 `Device` 类的实例开始。`Device` 类是 DirectX 库中所有图形绘制操作的核心所在,可以将其想象为实际的图形...

    用directx 9.0写的最简单的d3d程序

    总之,"用DirectX 9.0写的最简单的d3d程序"是一个基础的教程项目,旨在帮助初学者快速入门Direct3D编程,通过绘制一个简单的蓝色屏幕,理解Direct3D的基本工作流程和核心概念。通过对这个程序的实践和学习,开发者...

    Direct3D11 的入门代码示例.zip

    初级 Direct3D11 编程这是我在 Windows 上以简单的、程序化的(类似 C 语言)风格进行 Direct3D11 图形编程的起始代码。没有外部依赖,使用stb_image加载纹理和最少的 CRT 功能。在未经许可的情况下发布到公共领域,...

    DirectX 9 3D游戏程序设计入门

    2. **Direct3D基础**:学习Direct3D首先要了解基本的3D图形概念,包括坐标系统、顶点、多边形、纹理、光照和深度缓冲等。程序员需要创建顶点缓冲区来存储3D模型的几何信息,并通过Direct3D的渲染管线将这些信息转化...

    3D游戏程序设计入门+源代码

    3. **顶点和三角形**:3D模型由一系列顶点构成,这些顶点通过多边形连接,通常使用三角形作为基本构建块,因为它们最简单且计算效率高。 4. **光照和着色**:模拟真实世界中的光照是提升3D视觉效果的关键。这涉及到...

    Direct3D9入门教程

    在创建Direct3D设备时,需要选择合适的设备类型(如硬件加速或软件模拟)和呈现模式(如窗口模式或全屏模式)。 接着,学习如何绘制基本的几何图形。Direct3D9支持多种图元,如点、线和三角形,它们是构建复杂3D...

    DirectX程序设计入门

    1. Direct3D:这是DirectX的核心部分,用于3D图形渲染。通过Direct3D,开发者可以创建复杂的3D场景,包括几何体绘制、光照处理、纹理映射等。初学者应首先理解基本的3D坐标系统、顶点和索引缓冲区、渲染状态以及管线...

    3D游戏程序设计入门DirectX9

    - **Direct3D**:DirectX 9的核心组件之一,专门用于3D图形渲染。 - **DirectInput**:用于处理用户输入,如键盘、鼠标和游戏手柄等。 - **DirectSound**:用于音频处理。 #### 四、D3DX库简介 D3DX是DirectX 9的一...

    Unity3D 里面的Cg shader 入门

    - 最小着色器:展示最基本的Cg程序结构。 - RGB立方体:利用颜色立方体显示不同的颜色。 - 着色器调试:讲解如何检查和解决着色器中的错误。 - 世界空间着色:解释如何在物体的本地空间以外计算光照和颜色。 - 透明...

    03_HLSL程序入门

    接下来,我们讨论如何在Direct3D中加载和编译HLSL程序。首先,你需要创建一个ID3DBlob对象来存储编译后的着色器二进制代码。然后,使用D3DCompile函数将HLSL源代码编译为二进制。最后,通过ID3D11Device::...

    3D游戏程序设计入门(Book Code).rar

    10. **游戏逻辑**:最后,在Chapter 1,可能会介绍游戏循环、事件处理和基本的游戏状态管理,这些都是构建游戏核心框架的基础。 通过这些章节的学习和实践,读者可以逐步掌握3D游戏开发的基本技能,为构建自己的3D...

    3D游戏程序设计入门(龙书)

    书籍会逐步引导读者学习如何安装和配置DirectX环境,以及如何使用Direct3D进行基本的图形绘制。 七、图形管线 现代图形处理器遵循固定功能的图形管线,从顶点数据到屏幕上的像素,每个阶段都有特定的任务。书籍会...

    DX11游戏编程入门(中文版)

    - **Direct3D11**是DirectX11中最核心的部分,负责3D图形的渲染。 - **Direct3D11的几个阶段**: - **Vertex Shader**(顶点着色器):处理顶点数据。 - **Hull Shader**(外壳着色器):用于Tessellation。 - **...

    Introduction to 3D Game Programming with DirectX9.0c A Shader Approach

    接下来,学习者可能会了解到如何使用Direct3D进行基本的渲染操作,包括绘制简单的几何体(如立方体、球体等),以及如何操作顶点和索引来构建3D物体。此外,书中还可能深入介绍光照和材质的基础知识,比如漫反射、...

Global site tag (gtag.js) - Google Analytics