【Directx3D游戏开发】——Directx3D初始化

[C++]学习《DirectX12 3D 游戏开发实战》 第五天 初始化Direct3D 代码 初始化Direct3D 笔记 阅读详情


在了解如何初始化Directx3D之前应该首先懂得如何编写一个windows程序,创建一个windwos程序分为4步:1.设计一个窗口类;2.注册一个窗口类;3.创建窗口;4.显示及更新窗口。

            以下是创建一个最简单的windows窗口的示例,参考自孙鑫的VC++深入详解.

//-------------------------------------------------------------
//-------------by coderLing
//-------------------------------------------------------------

#include <Windows.h>
#include <tchar.h>
#include <iostream>

using namespace std;

//窗口回调函数
LRESULT CALLBACK WinSunProc(
	HWND hwnd,
    UINT uMsg,
	WPARAM wParam,
	LPARAM lParam
);

int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow
)
{
	//设计一个窗口类

	WNDCLASSEX wndcls;
	wndcls.cbSize = sizeof(WNDCLASSEX);
	wndcls.style = CS_HREDRAW | CS_VREDRAW;
	wndcls.lpfnWndProc = WinSunProc;

	wndcls.cbClsExtra = 0;
	wndcls.cbWndExtra = 0;

	wndcls.hInstance = hInstance;
	wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);
	wndcls.hCursor = LoadCursor(NULL,IDC_CROSS);

	wndcls.hbrBackground = 
		                static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH));
	
	
	
	
	wndcls.lpszClassName = L"CoderLing";
	wndcls.lpszMenuName = NULL;
	wndcls.hIconSm = 0;
	
	RegisterClassEx(&wndcls);


	//创建窗口,定义窗口句柄
	HWND hwnd;
	hwnd = CreateWindow(L"CoderLing",
		                L"coderling.com",
						 WS_OVERLAPPEDWINDOW,
						 0,
						 0,
						 600,
						 400,
						 NULL,NULL,hInstance,NULL);


	//显示及刷新窗口
	ShowWindow(hwnd,SW_SHOWNORMAL);
	UpdateWindow(hwnd);

	//定义消息结构体,开始消息循环
	MSG msg;
	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return static_cast<int>(msg.wParam);
}


//窗口过程函数
LRESULT CALLBACK WinSunProc(
	HWND hwnd,
	UINT uMsg,
	WPARAM wParam,
	LPARAM lParam
	){
		switch(uMsg){
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		}

	return 0;
}


//

windows程序基于事件消息驱动,上面代码只对WM_DESTROY消息进行了响应,唔。。。这并不是现在的重点,对于这个过程不了解的话,可以去找一本windows程序设计的书看一看,或者留下你的邮箱。重点是WinMain()函数里的消息循环,一般来说对于windows程序是在WIN_PAINT消息触发了才会发生窗口的重绘,但对于一个fps游戏来说我们希望他在没有消息时也应该自动重绘,所以要对这个消息循环进行修改,如下:

	MSG msg;
		SecureZeroMemory( &msg,sizeof( MSG ) );
		while( msg.message != WM_QUIT )
		{
			if( PeekMessage( &msg,NULL,0U,0U,PM_REMOVE ) )
			{
				TranslateMessage( &msg );
				DispatchMessage( &msg );
			}
			else
			{
				Render();
			}
		}

上面的当窗口没接收到WM_QUIT之前,也就是退出程序之前产生的相应消息进行处理。我们把GetMessage()换成了PeekMessage(),他们的主要区别在于,PeekMessage()函数无论是否接收到消息都会马上返回,这一点对于fps游戏能及时重绘画面十分重要。PeekMessage()接受到消息后就处理消息,当没消息是就重绘整个屏幕,Render() 1s内进行的次数就是FPS了。


   好了,现在才是主题,知道了怎去创建一个windows窗口,现在的任务就是在这个基础之上去初始化Directx3D.这里也分为3个要点:1.创建Directx3D对象;2.配置D3DPRESENT_PARAMETERS结构;3.获取Directx3D设备;4.编写渲染函数。

          1.第一步很简单,我们通过调用Direct3DCreate9( D3D_SDK_VERSION )

IDirect3D9* d3d9;
d3d9 = Direct3DCreate9(D3D_SDK_VESION);

D3D_SDK_VERSION 是此函数的唯一正确参数。

          2.填写D3DPRESENT_PARAMETERS结构,用于获取Directx3D设备。这个结构属性比较多,在这里者填写几个就可以了。

 

D3DPRESENT_PARAMETERS d3dpp;
	SecureZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.Windowed = TRUE; //
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //

          3.获取Directx3D设备,通过

HRSULT IDirectx3D::CreateDevice(
                                UNIT Adapter,                                    //用来创建IDirect3D9设备对象的显卡适配器
                                D3DDEVICETYPE DeviceType,                        //设置设备类型,如D3DDEVTYPE_HAL或D3DDEVTYPE_REF
                                HWND hFocusWindow,                               //创建的设备对象所绘制的窗口。
                                DWORD BehaviorFlags,                             //顶点处理方式,如D3DCREATE_HARDWARE_VERTEXPROCESSING
				                                                 //或者D3DCREATE_SOFTWARE_VERTEXPROCESSING
                                D3DPRESENT_PARAMETERS *pPresentationparameters,  //填写一个初始化过的D3DPRESENT_PARAMETERS结构
                                IDirect3DDevice9** ppReturnedDeviceIntface       //返回所创建的设备对象。
                                )

           4.最后是编写渲染函数,在这里我们只是把客户区的背景颜色变为蓝色。

VOID Render()
{
	if(NULL == g_pd3dDevice)
		return ;

	//Clear the backbuffer to a blue color.
	g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
	//Begin the scene
	if(SUCCEEDED( g_pd3dDevice->BeginScene() ))
	{
		//在此渲染场景里面的对象
		g_pd3dDevice->EndScene();
	}

	//Present the backbuffer contents to the display
	g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}

至此一个最简单的Directx3D程序就创建完毕了,完整代码如下:

/*---------配置初始化Directx3d---------*/
/*---------by coderLing-----------------/
#include <d3d9.h>

#define WND_NAME L"D3D"
#define WND_TITLE L"First Direct3DApp"

LPDIRECT3D9 g_pD3D = NULL; //use to create the D3DDevcie
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;  //our rendering device


/*---------初始化Direct3d----------*/
HRESULT InitD3D(HWND hWnd)
{
	//Create the D3D object,which is neededto create the D3DDevice.
	g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	if(NULL == g_pD3D)
		return E_FAIL;

	//Set up the structure D3DPRESENT_PARAMETERS
	D3DPRESENT_PARAMETERS d3dpp;
	SecureZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.Windowed = TRUE; //
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //

	//Create the direct3D device.
	if( FAILED( g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
		                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
						 &d3dpp,&g_pd3dDevice) ) )
	{
		return E_FAIL;
	}

	return S_OK;
}

/*------释放所有Direct3d资源------*/
VOID Cleanup()
{
	if(NULL != g_pd3dDevice)
		g_pd3dDevice->Release();
	
	if(NULL != g_pD3D)
		g_pD3D->Release();
}

/*------绘制窗口---------*/
VOID Render()
{
	if(NULL == g_pd3dDevice)
		return ;

	//Clear the backbuffer to a blue color.
	g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
	//Begin the scene
	if(SUCCEEDED( g_pd3dDevice->BeginScene() ))
	{
		//在此渲染场景里面的对象
		g_pd3dDevice->EndScene();
	}

	//Present the backbuffer contents to the display
	g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}

/*--------消息处理函数------------*/
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 );
}

/*---------主函数----------*/
INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
{
	//Register the window class
	WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,
	                  GetModuleHandle(NULL),NULL,NULL,NULL,NULL,
	                  WND_NAME,NULL};
	RegisterClassEx( &wc );

	//Create the application window
	HWND hWnd = CreateWindow( WND_NAME,WND_TITLE,WS_OVERLAPPEDWINDOW,100,100,300,300,
		                      GetDesktopWindow(),NULL,wc.hInstance,NULL );

	if( SUCCEEDED( InitD3D( hWnd ) ) )
	{
		ShowWindow( hWnd,SW_SHOWDEFAULT );
		UpdateWindow( hWnd );

		MSG msg;
		SecureZeroMemory( &msg,sizeof( MSG ) );
		while( msg.message != WM_QUIT )
		{
			if( PeekMessage( &msg,NULL,0U,0U,PM_REMOVE ) )
			{
				TranslateMessage( &msg );
				DispatchMessage( &msg );
			}
			else
			{
				Render();
			}
		}
	}

	UnregisterClass( WND_NAME,wc.hInstance );
}



Step by Step~~~~~~~~~~

托管DirectX教程:Direct3D设备初始化指南 本文还有配套的精品资源,点击获取 简介:本教程旨在指导初学者在C#环境下使用.NET Framework的Managed DirectX库来初始化Direct3D设备。Direct3D是Microsoft的图形API,用于创建高性能3D图形应用。教程将逐步介绍创建设备、选择适配器、设置呈现目标和模式、创建交换链、设置渲染状态、创建顶点和索引缓冲以及加载纹理等关键步骤,为创建... 阅读详情

相关推荐

Direct3D入门:3D图形基础自学指南

本文还有配套的精品资源,点击获取 简介:Direct3D是用于Windows平台的游戏和图形API,能够创建高性能的3D应用。本文通过一个简单的3D图形显示例子,介绍了D3D的基本结构和核心概念,包括创建D3D设备、渲染管线、着色器、交换链、资源管理和框架设计等关键知识点。文章通过实践,帮助读者理解并运用这些概念,构建一个3D图形显示项目,如旋转的立方体,以加深对Direc...

weixin_33759613的博客 2964

【Direct 3D - 0】入门第一步,资料准备

前言 掌握一个自己不懂得新技术,其实不困难,因为已经被前人开发出来了。就是说各方面得的定性很大,不存在让我们在未知中探索新发现得可能,所以只要方法得当,耐心钻研,细心验证,假以时日,肯定可以掌握。 而在刚开始学习的时候,为了可以尽快掌握最基本的用法,并能够上手使用。需要我们有这样一个思想——大部分理论和技术,其关键的核心思想和知识点其实不多,百分之八十被常用的领域其实就是其中百分只二十的知识点。所以高效找我这百分之二十,就是入门的关键。一旦正确入门,进阶巩固和提高就是时间我呢提。 关于 D3D的的入门学

春秋繁露 725

探索DirectX编程:从基础到3D立方体的绘制

本文将深入探讨DirectX编程的核心概念,通过分析VB语言编写的3D立方体绘制示例代码,揭示Direct3D的编程技巧。我们将学习如何设置Direct3D设备,如何创建和管理顶点数据,以及如何通过代码调整视角和渲染场景。

weixin_42598278的博客 497

我的Direct3D学习之路3:第一个3D绘图程序

之前已经详述过投影变换,这里不再赘述。 之前我们一直是在窗口中绘制,使用了D3DFVF_XYZRHW格式的顶点,D3D是默认顶点经过了处理,直接绘制在窗口上 现在我们用D3DFVF_XYZ格式来绘制,熟悉D3D对3D环境的处理过程 打开\Samples\C++\Direct3D\Tutorials\Tut03_Matrices路径下的工程 这个工程和上一个画三角形的工程相比其他

xf__mao的博客 5257

directx3d9教程

directx3d9初级 教程 Direct3D9初级教程 作者:祝晓鹰 余锋

DirectX 3D游戏编程实用教程[郑阿奇]

DirectX 3D游戏编程实用教程[郑阿奇],包含了源码和PDF电子书,整套资料,带书签版本

《DirectX12 3D游戏开发实战》读书笔记3:D3D12初始化

《DirectX12 3D游戏开发实战》读书笔记3

tikris的博客 1677

Direct3D教程

包含几个中文版的Direct3D教程,教程通俗易懂,并附有实例代码

【笔记】《DirectX 9.0 3D游戏开发编程基础》:Direct3D初始化

Direct3D初始化大概分为4个步骤: 1.获取接口IDirect3D9的指针。(Direct3DCreate9函数调用)。 该接口用户获取系统中物理硬件设备的信息并创建接口IDirect3DDevice9,此接口是一个C++对象,代表显示3D图形的物理硬件设备。 2.检查设备性能(D3DCAPS9结构体),判断主显卡是否支持某些特性,比如是否支持顶点运算。创建IDir...

aai7747的博客 456

达梦7实时主备集群

达梦7实时主备配置实时主备数据环境说明配置主库配置 dm.ini配置dmmal.ini配置dmarch.ini配置dmwatcher.ini配置dmwatcher.ini以mount方式启动主库设置OGUID修改数据库为primary模式配置备库 在服务器部署过程中,通常搭建有数据库主备集群,用于防备数据库服务器产生问题影响数据正常,在此,我们分享一下在虚拟机环境中模拟搭建实时主备的数据守护模式。 在搭建环境之前,需用户确认主备DM7的数据库已安装完成,且版本一致,同时还应注意各实例所在主机的操作系统位数、

g360382的博客 1022

Tinder养号防封攻略来了:最新Tinder养号流程和运营攻略

今天,我就来给大家分享一下Tinder养号的具体操作,以及针对Tinder账号被封的一些常见问题为大家做个答疑。

m0_67768117的博客 2万+

《DirectX12 3D游戏开发实战》第四章 :Direct3D的初始化

通过Direct3D这种底层图形应用程序编程接口API,即可在应用程序中对图形处理器GPU进行控制和编程。我们能够借此以硬件加速的方式渲染出虚拟的3D场景。Direct3D12 新特性:性能优化提升,减少了CPU开销,改进了对多线程的支持。为此Direct3D 12的API较11更偏于底层。

LIJIWEI0611的博客 1938

【企业微信自建应用-前端篇】企业微信自建应用开发流程详细介绍

最近接到需求,需要我在企业微信端自建一个应用,用来接受PC端派发的工单,告警,公告等内容。这里写一个帖子汇总一下我经历的全流程开发,当然这是基础的流程啊。因为功能要求也不高。后面如果开发更多的东西再补充。

weixin_44265726的博客 9397

DirectX12 3D游戏开发实践(龙书)第四章 Direct3D的初始化

DX12的学习,其中包含环境的配置

c++、UE 3282

碳酸钙岩石酸蚀酸溶COMSOL建模:非均质对酸蚀通道的影响

多孔介质中的流动与化学反应耦合是石油工程和地下资源开发中的核心问题,酸液与岩石矿物的溶蚀过程直接关系到酸化增产效果。在碳酸盐岩储层中,盐酸与方解石的反应速率极快,酸液会优先沿高渗透区域推进,形成指状酸蚀通道,即wormhole。传统均质模型难以描述这种局部溶蚀行为,而数值模拟工具COMSOL通过耦合达西定律、稀物质传递与孔隙度演化方程,能够定量刻画酸蚀路径与渗透率的变化规律。工程实践中,模拟结果可用于预测酸液突破体积、优化注入排量,并为基质酸化方案设计提供依据。本文围绕碳酸钙岩石酸蚀酸溶COMSOL模型,探

weixin_29009401的博客 326

ST MotorControl Workbench 6.2.1 自定义硬件配置避坑指南

本文详细介绍了ST MotorControl Workbench 6.2.1在自定义硬件配置中的常见问题与解决方案,涵盖功率板配置、采样电路校准、电机参数设置及代码生成避坑指南,帮助开发者高效完成电机控制项目开发。

red88的博客 1023

【阅读笔记之三】《DIRECTX.9.0.3D游戏开发编程基础》:Direct3D初始化

Direct3D初始化   一、Direct3D初始化预备知识           1. 表面             表面是Direct3D主要用于存储2D图像数据的一个像素矩阵。其组成部分如下图:             表面的宽度(width)和高度(height)都用像素来度量。跨度(pitch)则用字节来度量。代码中我们用接口 IDirect3DSurface9(一种COM类

Josh的专栏 2937

【Flink】FlinkSQL如何触发执行计算

Table (通过 StatementSet.addInsert() 输出给某个 Sink)和 INSERT 语句 (通过调用 StatementSet.addInsertSql())会先被缓存到 StatementSet 中,StatementSet.execute() 方法被调用时,所有的 sink 会被优化成一张有向无环图。该方法是用来将一个表的内容插入到目标表中,一旦该方法被调用, TABLE API 程序立即被翻译。该方法是用来执行一个 SQL 语句,一旦该方法被调用, SQL 语句立即被翻译。

一杯咖啡半杯糖的博客 1005

《DirectX 9.0 3D 游戏开发编程基础》学习笔记#2 D3D初始化

很长一段时间没写了,现在补上 博主使用的DirectX SDK版本为June 2010,以下以此版本为例,记录龙书上第二部分第一章中初始化Direct3D的API。 IDirect3D9指针获取,Direct3DCreate9函数原型: /* * DLL Function for creating a Direct3D9 object. This object suppor...

weixin_30500663的博客 180

【同等学力】2005-数学⭐✨

有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色,每个正方形只能染一种颜色,如果要求染红、黄、白色的正方形分别至少出现一个,问有多少种不同的染法?3、(4分)设G是一个有n个结点m条边的连通简单平面图,若n≥3,则m≤3n-6.4、(4分)证明:任何连通简单平面图至少有一个结点的度数不超过5

super_mochi1 305

信号与电源完整性5:轨道塌陷噪声/电源轨道噪声分析及降低解决方案

经过上一节关于串扰的分析,我们已经清楚,噪声问题不仅仅来源于信号网络;电源和地网络所产生的噪声,被反馈到其所在的元器件和信号网络时,其破坏力也是巨大的;本节所讨论的轨道塌陷噪声就是一个典型的实例。在经过电源的地网络的电流发生改变时,在电源和地之间的阻抗上将产生一个压降;由于该压降的产生,用电元件的电压将直接被拉低,甚至可能对电路产生功能性的错误。接下来硬小二将详细的分析电源轨道噪声和降低其的解决方法。...

fydar的博客 2241

directx12 3d+vs2022游戏开发第四章 笔记六 Direct3D初始化

Present。

qq_61988383的博客 508

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记

REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api。借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试。 D3DDEVTYPE 在程序代码中,HAL设备用值D3DDEVTYPE_HAL来表示。该值是一个枚举变量。REF设备用D3DDEVTYPE_REF来表示。这种类型非常重要,你需要铭记,因为在...

weixin_34320724的博客 205

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: div+css布局之定位
下一篇: 【Directx3D游戏开发】——简单渲染
CoderLing
博客等级 码龄15年 40粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值