directx-01-梦开始的地方

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

最近感觉有点荒废,为了让自己充实点,本人决定在csdn上写博客,学习directx9.0,为了游戏梦想。

由于自己也是初学,可能会犯很多错误,欢迎网友报错,欢迎前辈指点。

学习的参考书目为《Directx 游戏开发终极指南》,其实自己也买了龙书,但是感觉龙书相对比这本难理解,看完这个再学龙书。

一.先来介绍下directx

directx微软公司的DirectX是一个多媒体应用编程接口(API)工具包,DirectX主要用于游戏开发,但其中部分(而不是全部)用于开发其他类型软件,这些软件包括游戏虚拟角色、网络游戏和与游戏无关的图形软件。DirectX通过和底层硬件打交道,从而获取软件的最大性能。API DirectX主要由DirectGraphics、DirectInput、DirectPlay、DirectMusic和DirectSound组成。DirectX中的每个API都可以通过硬件加速。

DirectGraphics是DirectX API,主要负责向屏幕上渲染二维图形和三维图形。有经验的程序员会认为DirectGraphics是Direct3D。

DirectInput是Direct API,可以直接使用所有与计算机关联的输入设备。这些设备包括键盘、鼠标和游戏控制器设备。

DirectPlay控制台DirectX中网络功能的API。

DirectMusic是DirectX API中的一员,负责声音的处理。

DirectX中的DirectSound API提供了更高级声音处理能力。

要进行directx开发,首先去微软下载directxsdk。

二.初始化win窗口,由于d3d是微软的东西,自然也要在windows平台上开发了,我们的开发平台为vs2010-win32平台,所以我们先来初始化一个windows窗口

(和vc++游戏编程第一节有点重复,所以这里不讲了)我们主要来初始化一个d3d窗口;

首先你要引用d3d里面的lib,这时你 必须先安装好directxsdk,然后在vs2010项目中加载链接项

#include<d3d9.h>							//头文件

#pragma comment(lib, "d3d9.lib")			//调用库
#pragma comment(lib, "d3dx9.lib")

#define WINDOW_CLASS "UGPDX"				//宏
#define WINDOW_NAME  "D3D Window"
// 定义顶点格式标识符,即灵活顶点格式
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)


// Function Prototypes... 声明
bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects();          // 用于创建演示程序中要绘制在屏幕上的物体
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;   // 定义了一个顶点缓存对象
void RenderScene();
void Shutdown();


// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;					//初始化D3D对象
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;	

// 定义场景中单个3D点的结构
struct stD3DVertex
{
	float x, y, z, rhw;    // 点的x,y,z坐标值
	unsigned long color;   // 点的颜色
};



LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //消息回调函数
{
	switch(msg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
		break;

	case WM_KEYUP:
		if(wParam == VK_ESCAPE) PostQuitMessage(0);
		break;
	}

	return DefWindowProc(hWnd, msg, wParam, lParam);		//销毁
}


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
	// Register the window class
	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
		GetModuleHandle(NULL), NULL, NULL, NULL, NULL,WINDOW_CLASS, NULL };  //创建窗口类
	RegisterClassEx(&wc);	//注册窗口类

	// Create the application's window  创建窗口
	HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW,
		100, 100, 640, 480, GetDesktopWindow(), NULL,
		wc.hInstance, NULL);

	// Initialize Direct3D初始化
	if(InitializeD3D(hWnd, false))
	{
		// Show the window
		ShowWindow(hWnd, SW_SHOWDEFAULT);
		UpdateWindow(hWnd);

		// Enter the message loop
		MSG msg;
		ZeroMemory(&msg, sizeof(msg));

		while(msg.message != WM_QUIT)
		{
			if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
				RenderScene();		//渲染屏幕
		}
	}

	// Release any and all resources.
	Shutdown();			//释放D3D对象

	// Unregister our window.
	UnregisterClass(WINDOW_CLASS, wc.hInstance);
	return 0;
}


bool InitializeD3D(HWND hWnd, bool fullscreen)		//初始化D3D
{
	D3DDISPLAYMODE displayMode;

	// Create the D3D object.
	g_D3D = Direct3DCreate9(D3D_SDK_VERSION);  //创建D3D接口对象
	if(g_D3D == NULL) return false;

	// Get the desktop display mode.显卡信息
	if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
		return false;

	// Set up the structure used to create the D3DDevice
	//建立D3DPRESENT_PARAMETERS结构,用于定义Direct3D窗口的显示信息

	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(d3dpp));

	if(fullscreen)
	{
		d3dpp.Windowed = FALSE;
		d3dpp.BackBufferWidth = 640;
		d3dpp.BackBufferHeight = 480;
	}
	else
		d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = displayMode.Format;

	// Create the D3DDevice
	if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
		D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
	{
		return false;
	}

	return true;
}


void RenderScene()
{
	// Clear the backbuffer.
	g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);

	// Begin the scene.  Start rendering.
	g_D3DDevice->BeginScene();

	// End the scene.  Stop rendering.
	g_D3DDevice->EndScene();

	// Display the scene.
	g_D3DDevice->Present(NULL, NULL, NULL, NULL);
}


void Shutdown()
{
	if(g_D3DDevice != NULL) g_D3DDevice->Release();
	if(g_D3D != NULL) g_D3D->Release();

	g_D3DDevice = NULL;
	g_D3D = NULL;
}

InitializeD3D()函数开始先调用Direct3DCreate9()函数。Direct3DCreate9()函数将创建一个Direct3D接口对象,并返回该对象。该函数所带的参数值为D3D_SDK_VERSION。如果从该函数创建的接口不为NULL(空),那么接口创建成功。如果是NULL,那么创建接口时就会出现一些错误,并且由于其余步骤在很大程度上取决于是否成功调用Direct3DCreate9()函数,所以一旦出现错误,就会立刻退出Direct3D初始化程序。
接下来调用的是GetAdapterDisplayMode()函数,该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。
DirectX11学习01】用一个类封装DirectX的初始化 DirectX的初始化步骤较为繁琐,这里将DX的初始化扔进类的初始化(构造函数)里(如果构造函数里还要执行其他逻辑,那就最好把D3D的初始化扔进一个内联函数,这样能够更好地区分逻辑),下次要使用的时候,就直接继承该类,然后在这基础上写自己的东西 首先准备一个AppPublic.h,包含了以后可能要用到的所有头文件 #pragma once #ifndef _APP_PUBLIC_ #def... 阅读详情

相关推荐

Directx 3D编程实例:多个3D球的综合Directx实例

最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档。于是我也觉的有这个必要。写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客。 第一步:判断显卡是否支持 using System; using System.Collections.Generic; using System.Linq

计算机的目的不是“吓唬”大众的工具! 3027

从零开始掌握DirectX11图形编程:Windows SDK实战完全指南

DirectX11图形编程是Windows平台3D应用开发的核心技能,而DirectX11-With-Windows-SDK项目提供了一个完整的现代DX11系列教程,使用Windows SDK(C++)开发Direct3D 11.x应用。无论你是图形编程新手还是有经验的开发者,这个项目都能帮助你系统性地掌握DirectX11的核心技术。 ## 🎯 为什么选择DirectX11进行Windows

gitblog_00495的博客 1070

旅程学习笔记 DirectX开发入门01:应用程序基本框架

本文属于《逐旅程》学习笔记系列的DirectX篇,与系列的Windows/GDI并列。 本系列不打算深入研究DirectX而只是简单介绍DirectX中应用最广泛的部分:Direct3D 作为本篇的开篇,我们用一个最简化的示例来说明。 这个示例的完整代码可以在这里找到https://github.com/fengyhack/DirectGame/tree/SimpleDemo 首

B0tt3rf1y 1141

DirectX 11 学习笔记-Demo-01

前言  这个Demo包含了《Introduction to 3D Game Programming with Directx 11》前12章的内容,我将它们都整合到同一个Demo中。学习的过程中还是建议循序渐进,按照书本的介绍进行练习。  另外,我不会详细介绍代码的每一部分,所以如果希望学习相关内容,可以结合书本阅读源码。  Demo源码可以在GitHub上获取 https://github...

Zealot_Alie的博客 821

DX11 Without DirectX SDK--01 DirectX11初始化

由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了以Init Direct3D项目作为框架,然后还使用了微软提供的示例项目,两者结合到一起。建议下载项目配合阅读项目结构该项目包含了下面这些文件其中头文件的具体功能头文件功能d3dApp.hDirect3D应用程序框架类dxerr.hD...

li123128的博客 1287

DirectX修复工具增强版

DirectX修复工具,一键式解决0xc000007b问题神器,同时还可解决诸如dll文件缺失、DirectX异常、C++异常等问题,装机必备!本文对应增强版,可以解决绝大多数问题。

VBcom的专栏 656万+

Beginning DirectX 10 Game Programming(Chapter 01 DirectX介绍)

DirectX是Windows平台下的游戏API。几年前,游戏开发者纠结于硬件的不兼容,很难让每个人玩上同一个游戏。随后,微软推出了DirectX。它为游戏开发者提供一个单一而干净的API,可以超越不同种类的硬件来达到兼容性。由于DirectX的发行,Windows平台下的游戏数量显著增长。          在这一章,会包含以下内容: 理解DirectX是什么为什么DirectX

key_ring 1145

Game Programming with DirectX -- 01[初识Direct3D]

 Game Programming with DirectX -- 01[初识Direct3D]第一卷 朦胧的3D世界   第一集 初识Direct3D   简介 我们通过2个例子来简单的认识3D   1.1 接口和数据结构   我们首先来看看我们以后用的比较多的接口, a. IDirect3D9 b. IDirect3DDevice9

rabbit729的专栏 1724

DirectX11 With Windows SDK--01 DirectX11初始化

DirectX11 With Windows SDK--01 DirectX11初始化 原文:DirectX11 With Windows SDK--01 DirectX11初始化前言 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,...

weixin_30500289的博客 565

DirectX的安装与配置(VC6.0)

当前环境VC6.0与November2007的DirectX9.01.从微软网站上下载DirectX进行安装,安装时请记下安装目录开发环境配置:1.指定头文件和库文件的位置,在VC6.0中选择Tools|Options|Directories在Show directories for:Library files中加入Direct的lib路径如:C:/Program Files/Micros

xinxun的地盘 6585

摸爬滚打DirectX11_day01——VS2015与DirectX11的配置

**什么是DirectX11?**DirectX,微软提供的应用程序接口集(APIs),被设计为在运行 windows 操作系统平台上用来提供给开发人员控制硬件的底层接口。它的各个组件提供了访问不同硬件的能力,包括图形(显卡),声音(声卡),GPU,输入设备以及所有的标准接口(译者注:比如游戏操纵杆,鼠标等)。 DirectX 是首先被游戏制作者用来在 Windows 和 Xbox 平台上使用的标准

fruit的博客 4085

DirectX11学习笔记01

这个是我学习Direct11的学习笔记,笔记大多是来源于这个英文网站,边学习边锻炼自己的英文水平。 Choosing a Graphics API: Direct3d与OpenGL之争:语言之争永远都是这么硝烟弥漫,我大二的时候学习了计算机图形学,里面用的是OpenGL,为什么现在要转去学D3D呢?可能是它太难了,可能是太落后了。这些都不重要,主要分析一下各自优势和应用范围。 如...

小陀螺 466

DirectX11终极指南:从零开始掌握3D图形编程的完整教程

想要在Windows平台上开发令人惊叹的3D图形应用吗?DirectX11-With-Windows-SDK项目为你提供了一套完整的现代DX11系列教程,专为使用Windows SDK(C++)开发Direct3D 11.x应用而设计。这个开源项目通过精心设计的示例代码和渐进式学习路径,帮助开发者从基础概念到高级渲染技术全面掌握DirectX11图形编程。 ## 🚀 为什么选择这个Direct

gitblog_00466的博客 964

DirectX错误号及其原因

转自http://blog.csdn.net/flipcode/archive/2008/01/28/2070181.aspx /* dxerr.c - DirectX 8 & 9 Error Functions Written by Filip Navara This library is distributed in the hope that it will be use...

学无止尽,谨言慎行! 4712

从零开始掌握DirectX11图形编程的完整指南:使用Windows SDK开发3D应用

DirectX11-With-Windows-SDK是一套现代DX11系列教程,专为希望使用Windows SDK(C++)开发Direct3D 11.x应用的开发者设计。本指南将带你逐步探索这个强大的图形编程框架,从基础概念到高级渲染技术,让你快速掌握3D图形开发的核心技能。 ## 🚀 为什么选择DirectX11进行图形开发? DirectX11作为微软推出的图形API,在Windows

gitblog_00146的博客 1001

[DirectX]3D.Game.Engine.Programming:01

最近找到一本好书《3D.Game.Engine.Programming》,讲的是引擎相关的内容,最重要的是底层渲染采用的是DirectX,不是OpenGL太好了(根本就没学过,之前看了很多都是讲OpenGL的,太累了)。 前2章没啥内容,第一章介绍引擎是啥,游戏开发人员(从策划到程序),DirectX和OpenGL的战争,稍微过一下就好(太多生僻词了)。第二章就介绍了需...

学习之路 1190

DirectX8.1 01-使用COM

这是我翻译的DirectX8.1SDK文档,第一次翻译,有些词汇翻译的不太准。1.  什么是COM对象COM对象同C++对象的不同:A.            COM对象比C++对象有强制性的更严格的封装。COM对象的方法被一个或多个接口组织起来。要使用一个方法,必须创建一个对象并且从对象中得到合适的接口。B.             COM对象不像C++对象那样创建。有几种方式创建COM对象,但

来往 3983

[DirectX]Programming.Role.Playing.Games:01-开始

为什么突然开始Programming.Role.Playing.Games.with.DirectX是有原因的,DX11卡font这节,HLSL被书坑了,学习进程被打乱了,之前有瞄了一眼Programming.Role.Playing.Games.with.DirectX,发现讲的还是不错的,通俗易懂,就拿来练习下。 本来打算是先学完DX11的,但是坑爹的是到dx11的f...

学习之路 459
上一篇: vc游戏--02--游戏画面绘图
下一篇: vc游戏--03--绘制位图
和氏璧
博客等级 码龄16年 14粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值