Lesson 7: 初始化Direct3D

Lesson 16: SDK文档:Tutorial 5 3D Transformation分析 中文翻译文档: http://blog.sina.com.cn/s/blog_6e1283650101cwy7.html深度缓存:没有它的话,在比较小的轨道中,第二个立方体将总是绘制在第一个立方体的上面,即使当它旋转到第一个立方体的后面的时候。深度缓冲区允许Direct3D检测画在屏幕上每个像素的深度。在Direct3D 11中的默认操作是将要画的每个像素和已经在屏幕上的对应像素的深度进行比较。如 阅读详情

原文地址:
http://www.directxtutorial.com/Lesson.aspx?lessonid=11-4-2

COM:
COM是组件对象模型Component Object Model的简称,是一项能够使DirectX独立于编程语言并具备版本向后兼容的技术。
我们常称COM对象为接口,可视它为C++类来使用。在以C++编程语言和COM接口方式开发的DirectX应用程序中,可以直接访问COM接口和对象,许多COM的底层细节都不必考虑。
我们唯一需要知道的一件事情是,我们必须通过特定的函数或其他的COM接口方法来获取指向COM接口的指针,而不能用C++的new关键字来创建COM接口。另外,当我们不再使用某个接口时,必须调用它的Release方法来释放它(所有的COM接口都继承于IUnknown接口,而Release方法是IUnknown接口的成员),而不能用delete语句——COM对象在其自身内部实现所有的内存管理工作。

Direct3D提供的是一组软件接口,我们可以通过这组接口来控制绘图硬件:

device->CreateRenderTargetView()

device->Release()

尽管COM为我们隐藏了很多复杂的细节,但仍有四点需要我们知道:

1.一个COM对象是被接口控制的一个类或者类的集合。。上述例子中,device就是一个COM接口对象。

2.每种类型的COM对象都有一个独特的ID

3.当完成对一个COM对象的使用的时候,必须调用Release()函数来释放它的内存以及关闭它的线程。

4.COM对象很容易识别,一般以I开头命名,例如’ID3D10Device’

Direct3D头文件:

// include the basic windows header files and the Direct3D header files
#include <windows.h>
#include <windowsx.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>

// include the Direct3D Library file
#pragma comment (lib, "d3d11.lib")
#pragma comment (lib, "d3dx11.lib")
#pragma comment (lib, "d3dx10.lib")

// global declarations
IDXGISwapChain *swapchain;             // the pointer to the swap chain interface
ID3D11Device *dev;                     // the pointer to our Direct3D device interface
ID3D11DeviceContext *devcon;           // the pointer to our Direct3D device context

// function prototypes
void InitD3D(HWND hWnd);     // sets up and initializes Direct3D
void CleanD3D(void);         // closes Direct3D and releases memory

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

d3d11.h文件包含了Direct3D的主要部分,d3dx11.h包含了Direct3D的扩展内容,对图形库不是必要的,但是对写游戏和其他图形程序很方便。
注意:不是所有的编译器都能自动定位这些文件,你需要设置你的project去DirectX SDK的文件夹中查找,visual studio设置教程:here

Direct3D 11是Direct3D 10的扩充,因此它从Direct3D 10中延续了许多宏定义,函数和类。d3dx10.h头文件允许我们在程序中使用这些。

“#pragma comment”指令将指定一块信息放置在你的project对象文件中。通过第一个参数,表明我们想为它添加一个库,然后第二个参数指定内容。所以这些指令包含了Direct3D 11的库文件。

ID3D11Device *dev;
这个变量是设备的一个指针。
这行代码意味着我们创建了一个叫ID3D11Device的COM接口对象。我们间接通过这个指针来使用这个接口对象。

ID3D11DeviceContext *devcon;
这个变量是一个设备上下文的COM接口对象的指针。
设备上下文和设备类似,但它用于管理GPU和渲染流水线(大部分用于处理显存)。这个接口对象用于渲染图形以及决定何时被渲染。
IDXGISwapChain *swapchain;
这个变量是交换链的接口对象的指针。
注意到这个接口对象不是属于Direct3D的,而是DXGI的一部分。

启用Direct3D:
第一步实际上就是创建并初始化上述的COM接口对象:

// this function initializes and prepares Direct3D for use
void InitD3D(HWND hWnd)
{
    // create a struct to hold information about the swap chain
    DXGI_SWAP_CHAIN_DESC scd;

    // clear out the struct for use
    ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

    // fill the swap chain description struct
    scd.BufferCount = 1;                                    // one back buffer
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // use 32-bit color
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      // how swap chain is to be used
    scd.OutputWindow = hWnd;                                // the window to be used
    scd.SampleDesc.Count = 4;                               // how many multisamples
    scd.Windowed = TRUE;                                    // windowed/full-screen mode

    // create a device, device context and swap chain using the information in the scd struct
    D3D11CreateDeviceAndSwapChain(NULL,
                                  D3D_DRIVER_TYPE_HARDWARE,
                                  NULL,
                                  NULL,
                                  NULL,
                                  NULL,
                                  D3D11_SDK_VERSION,
                                  &scd,
                                  &swapchain,
                                  &dev,
                                  NULL,
                                  &devcon);
}

DXGI_SWAP_CHAIN_DESC scd;
为了创建swap chain,我们填充一个DXGI_SWAPCHAIN_DESC结构体,这个结构体描述了我们要创建交换链的对象属性。它的变量虽然很多,但是我们只要关心一小部分就可以了。
为了创建swap chain,我们填充一个DXGI_SWAPCHAIN_DESC结构体,DXGI_SWAPCHAIN_DESC结构体描述了我们要创建swap chain的对象属性。DXGI_SWAPCHAIN_DESC结构体的变量虽然多,但是我们只要关心一小部分就可以了。

ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
快速对整个scd结构体清空。

scd.BufferCount = 1;
这个成员决定了我们交换链中要使用的后台缓冲区数量。

scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
这个成员决定了颜色的格式,在前台缓冲区和后台缓冲区,每个像素是以颜色来存储的。

scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
这个成员决定了我们将要如何使用我们的交换链。
这个参数大多数从下面两个中取值:
这里写图片描述
scd.OutputWindow = hWnd;
这个值决定了Direct3D应该绘制在哪个窗口。

scd.SampleDesc.Count = 1;
像素多采样抗锯齿,最小值为1,最大值为4,越高抗锯齿越好。

Multisample Anti-Alias (MSAA):
这里写图片描述

scd.Windowed = TRUE;
Direct3D运行在窗口中设为TRUE,全屏则设为FALSE。

D3D11CreateDeviceAndSwapChain():
这是一个很大的函数,但实际上我们写的每个游戏程序里,大部分参数都是一样的。
这个函数用于创建设备,设备上下文以及交换链的COM接口对象。一旦我们创建好了,我们可以使用它来实现渲染。

函数的原型如下:

HRESULT D3D11CreateDeviceAndSwapChain(
    IDXGIAdapter *pAdapter,
    D3D_DRIVER_TYPE DriverType,
    HMODULE Software,
    UINT Flags,
    D3D_FEATURE_LEVEL *pFeatureLevels,
    UINT FeatureLevels,
    UINT SDKVersion,
    DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
    IDXGISwapChain **ppSwapChain,
    ID3D11Device **ppDevice,
    D3D_FEATURE_LEVEL *pFeatureLevel,
    ID3D11DeviceContext **ppDeviceContext);

IDXGIAdapter *pAdapter,
这个值表明Direct3D应该使用的图形适配器。图形适配器指的是GPU和它的显存以及数模转换器等等。而我们只要设为NULL,表明使用默认适配器,交给DXGI决定就好了。

D3D_DRIVER_TYPE DriverType,
这个参数决定了Direct3D创建时应该使用的驱动类型。

有下列参数可选:
这里写图片描述

HMODULE Software,
DLL中的一个软件光栅句柄。通过LoadLibrary,LoadLibraryEx,或GetModuleHandle来获取这个句柄。
当D3D_DRIVER_TYPE值为D3D_DRIVER_TYPE_SOFTWARE时,这个值必须不为NULL,否则无效。

UINT Flags,
该参数用于运行层(参考D3D_CREATE_DEVICE_FLAG)。可用逻辑符号OR来操作。

这个参数可有以下取值:
这里写图片描述

D3D_FEATURE_LEVEL *pFeatureLevels,
这个指针指向一个D3D_FEATURE_LEVEL数组,来决定创建时排序的功能级别。默认使用最佳的功能级别。
在Direct3D 11中,我们设置为NULL就好了。

UINT FeatureLevels,
pFeatureLevels中的元素数量.。设置为NULL即可。

UINT SDKVersion,
SDK版本;始终使用D3D11_SDK_VERSION

DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
这个指针指向一个交换链接描述(参考:DXGI_SWAP_CHAIN_DESC),包含用于这个交换链接的初始化参数。
我们设置为交换链scd的地址。

IDXGISwapChain **ppSwapChain,
返回一个IDXGISwapChain对象的指针地址,这个交换链接用于渲染。

ID3D11Device **ppDevice,
返回一个创建好的 ID3D11Device对象的指针地址。供应一个NULL指针,返回一个pFeatureLevel中所支持的最高功能级别。
这里我们定义了ID3D11Device接口对象的指针为dev,所以设置为dev的地址。

D3D_FEATURE_LEVEL *FeatureLevel,
返回一个D3D_FEATURE_LEVEL指针,它来着pFeatureLevel中设备所支持的第一个元素。
设置为NULL即可。

ID3D11DeviceContext **ppImmediateContext
返回一个ID3D11DeviceContext对象指针,它代表这个设备上下文。
这里我们定义这接口对象为devcon,所以我们将devcon的地址放在这个参数中。

最终,这个函数使用如下:

D3D11CreateDeviceAndSwapChain(NULL,
                              D3D_DRIVER_TYPE_HARDWARE,
                              NULL,
                              NULL,
                              NULL,
                              NULL,
                              D3D11_SDK_VERSION,
                              &scd,
                              &swapchain,
                              &dev,
                              NULL,
                              &devcon);

关闭Direct3D:
创建Direct3D之后,使用完毕,我们必须将它关闭。

很简单,只有三行命令:

// this is the function that cleans up Direct3D and COM
void CleanD3D()
{
    // close and release all existing COM objects
    swapchain->Release();
    dev->Release();
    devcon->Release();
}

我们通过调用设备的接口对象的Release()函数来释放内存,以便计算机可以回收不被占有的内存。如果不进行释放,它将一直在后台运行。

补充:
硬件设备(hardware device)是一个运行在显卡上的D3D设备,在所有设备中运行速度是最快的。这将是我们日后讨论最多的一种类型。

软件驱动设备(software driverdevice)是开发人员自己编写的用于Direct3D的渲染驱动软件。这种方式通常不推荐用于高性能或者对性能要求苛刻的应用程序,下面介绍的WARP设备将是更好的选择。

D3D设备一般都是设备本身和硬件之间的通信,而D3D上下文是一种描述设备如何绘制的渲染设备上下文,这也包含了渲染状态和其他的绘图信息。
交换链是设备和上下文将要绘制的渲染目标。

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

相关推荐

Direct3D图形渲染入门:初始化与图片透明显示技术

Direct3D支持多种混合模式,它们允许开发者混合像素颜色与目标表面颜色,以实现半透明和其他视觉效果。混合模式控制了源像素颜色(来自渲染的纹理)和目标像素颜色(已经存在于屏幕上)如何进行混合。常用的混合模式包括源颜色乘以一个系数,目标颜色乘以另一个系数。通过本章节的介绍,我们了解了纹理映射的基础知识,掌握了如何使用Direct3D进行透明纹理的绘制,并探索了多重纹理技术与动态纹理更新的方法。这些技巧在增强3D模型视觉表现力的同时,也提供了更多的创作自由度。

weixin_42510243的博客 1244

DirectX教程(6):初始化Direct3D

  在上一节,我们已经研究了关于Direct3D的基本概率,现在让我们开始构建一个简单的Direct3D程序,以便深入探讨实际问题。在这个程序中,我们只是初始化Direct3D,然后将其关闭。虽然内容不多,甚至连一个“hello world”级别都不算,但这是一个好的开始。 COM   COM是组件对象模型(Component Object Model)的缩写,它是一种创建非常高级对象的方法,它的...

父进程的博客 2433

C#与Direct3D的深度集成:3D图形编程实战教程

Direct3D作为图形管线的核心组件,其架构设计为开发者提供了高效处理图形数据和渲染管线的手段,从而实现高质量的3D效果。Direct3D是微软公司推出的一套用于游戏开发和实时图形处理的DirectX API的3D图形组件。由于其底层特性和功能复杂性,通常开发者会选择集成第三方库来简化开发流程。本章将详细介绍C#环境下,Direct3D集成常用的第三方库的作用、安装配置方法和高级特性。3D渲染管线是一系列将3D场景转换为2D图像的步骤。

weixin_34511754的博客 1092

Direct3D 12入门教程之 ---- Direct3D 12初始化流程

注:以下内容参考自 书籍:《DirectX 12 3D》游戏开发实战, 微软官方的 DirectX样例程序;DirectX-Graphics-Samples, 参见github链接:https://github.com/Microsoft/DirectX-Graphics-Samples Direct3D 12对于开发者来说,就是一个SDK, 这篇文章就来讲一讲这个SDK的初始化流程,以及我在...

你可知外面的世界多大 6422

Direct3D 11基础教程:从代码到渲染实现

Direct3D 11是微软公司推出的一套高性能3D图形编程接口,它允许开发者在Windows平台上创建复杂的视觉效果。本章旨在为读者提供Direct3D 11的核心概念概览,为后续章节中关于设备创建、资源管理、渲染流程、交换链、着色器绑定和绘制命令的深入了解打下基础。Direct3D 11的架构包括多个核心组件,如设备(Device)、设备上下文(Device Context)、资源(Resources)和着色器(Shaders)。

weixin_35636570的博客 1555

Direct3D游戏开发入门教程PDF+实例代码

Direct3D游戏开发入门教程PDF+实例代码

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

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

春秋繁露 726

Direct3D教程

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

【DirecX 教程】Lesson 7:初始化Direct3D

 Lesson 7:初始化Direct3D 课程z

Purplenigma的专栏 1021

Direct3D游戏编程入门教程2

Direct 3D 游戏编程入门教程(第2版)基于DirectX 9.0,是介绍Direct3D技术的入门教程,详细介绍了Direct3D的背景、基本知识以及3D程序设计的相关概念与技术。全书由浅入深,分为四个部分,第一部分介绍Direct3D的发展历史和基本知识,对3D程序设计中的术语、概念进行了深入讲解;第二部分着重讨论纹理映射技术,包括多重纹理等;第三部分通过多个示例来探讨高级shader编程,并对.MD3文件格式做了详细分析;第四部分是附录,对本书中用到的概念和技术知识背景进行了简单补充。 Direct 3D 游戏编程入门教程(第2版)适用于略有DirectX基础的C/C++程序员学习Direct3D游戏开发,也适用于具有Direct3D开发经验的程序员参考。

Direct3D9初级教程(程序)

看了祝晓鹰 余锋的Direct3D9初级教程,但是他提供的网址下载不了程序了,自己写了下。VC 6.0的,必须按照DX才能运行

Lesson 18: SDK文档:Tutorial 7 Texture Mapping and Constant Buffers分析

中文翻译文档地址: http://blog.sina.com.cn/s/blog_6e1283650102vfi9.html学习心得:学完本篇,D3D11 SDK文档附带的教程就全部学习完了,想要真正掌握的话,还是需要不断地对代码进行修改,有什么好的想法就在原代码基础上添加、修改,这样你也能在这个过程中弄清其作用及含义。纹理映射纹理映射是指2D纹理到3D几何模型的投影。我们可以认为它是一种包装。为

Nim的辙迹 640

Direct3D游戏开发入门教程

[游戏开发参考书-Direct3D游戏开发入门教程].Beginning.Direct3D.Game.Programming.rar

【DirecX 教程】Lesson 1: 游戏的部件

Lesson 1: The Parts of a Game

Purplenigma的专栏 746

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南

本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。

weixin_30514745的博客 263

Node-Red系列教程——NodeRed通过OPC UA读取数据并写入mysql

NodeRed通opcua读取西门子数据并存入mysql

鲸鱼姐的专栏 1万+

Direct3D 11 Tutorial 1: Basics_Direct3D 11 教程1:基础

Github-LearnDirectX-DX3D11 tutorial01 概述 在这第一篇教程中,我们将通过介绍创建最小Direct3D应用程序所必需的元素。每一个Direct3D应用程序必需拥有这些元素才能正常地工作。这些元素包括设置窗口和设备对象,以及在窗口上显示颜色。 资源目录 (SDK root)\Samples\C++\Direct3D11\Tutorials\T...

433

通达信指标加密DLL加密解密三个公式源码准确率90%以上超级指标精准买卖绝世指标

通达信指标加密DLL加密解密三个公式源码准确率90%以上超级指标精准买卖绝世指标 1 超级指标 指标公式:买卖提示非常明显(适合通达信) 指标源码如下: M:3 100 60 N 3 100 30 散户线: 100*(HHV(HIGH,M)-CLOSE)/(HHV(HIGH,M)-LLV(LOW,M));RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100; K:=SMA(RSV,5,1); D:=SMA(K,3,1); J:=3*K-2*D;主力

m0_60244077的博客 3万+

Direct3D 初始化

Direct3D是一套底层图形API,借助API,我们能够利用硬件加速功能绘制3D场景,Direct3D 可以被视为应用程序与图形设备交互式的中介,它们之前的关系可以描述如下 应用程序--->Direct3D--->HAL--->图形设备 在Direct3D和图形设备之间有一个中间环节,HAL(Hardware Abstraction Layer)由于市面上的图形卡品种繁多,每种卡性能

阿凡的专栏 1814

从零配置EtherCAT IGH主站:手把手教你处理内核版本与实时性优化的那些坑

本文详细指导如何从零配置EtherCAT IGH主站,涵盖内核版本适配、实时性优化及常见问题解决方案。通过精确匹配内核头文件、应用实时补丁和优化网卡驱动,帮助开发者实现微秒级响应,适用于工业自动化、机器人控制等高精度场景。

weixin_30790841的博客 382

西门子S7-1200与汇川SV660P伺服速度模式实战:从接线到编程全流程

本文详细解析了西门子S7-1200 PLC与汇川SV660P伺服驱动器在速度模式下的集成实战。内容涵盖从硬件接线、伺服参数关键设置(如电子齿轮比)、博图软件组态到PLC编程的全流程,并提供了故障排查与性能优化指南,帮助工程师快速实现精准、稳定的运动控制。

weixin_29248313的博客 487

Direct3D-S2项目启动与配置教程

Direct3D-S2项目的目录结构如下所示: ``` Direct3D-S2/ ├── assets/ # 存放项目所需资源文件 ├── LICENSE # 项目使用的MIT许可证文件 ├── README.md # 项目说明文件 └── ... # 其他项目相关文件 ``` ...

gitblog_00689的博客 653

MITRE ATT&CK超详细学习笔记-01(背景,术语,案例)

MITRE是一个向美国政府提供系统工程、研究开发和信息技术支持的非营利性组织,于1958年从麻省理工学院林肯实验室分离出来后参与了许多最高机密的政府项目,开展了大量的网络安全实践。例如,MITRE公司在1999年发起了常见披露漏洞项目(CVE,CommonVulnera-bilitiesandExposures)并维护至今。其后,MITRE公司还维护了常见缺陷列表(CWE,CommonWeaknessEnumeration)这个安全漏洞词典。.........

Zichel77的博客 1万+

direct基础学习(二) 最简单的direct3d

        如果说Windows是一个企业,那么directx是它的一个部门,我们创建一个Windows程序是,需要Windows部门的配合,二directx是一个功能部门,需要使用directx功能时候便需要directx部门参与。Windows部门以窗口出现我们的程序中,directx也以它的方式参与我们的程序要使用direct绘图,步骤如下:1)建立一个direct3d对象2)建

cl_gamer的专栏 2506

利用PaddleOCR识别增值税发票平台验证码(开箱即用)

下面直接讲解利用paddleocr识别的思路,为什么使用paddleocr,因为paddle中集成了较好的ocr文字识别模型,开箱即用即可,废话不多说,剑指主题,识别思路步骤如下。

码王吴彦祖的博客 5544

Dify 本地插件安装失败?别慌,这篇教程手把手教你解决(解决 the plugin you want to install has a bad signature 报错的问题)

🤯dify安装本地插件报错 PluginDaemonBadRequestError: plugin verification has been enabled, and the plugin you want to install has a bad signature。的解决方案!

XiaoqiangClub的博客 3985
上一篇: Lesson 6: 理解计算机图形学
下一篇: Lesson 8: 渲染框架
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值