图形设备接口及绘图

合集下载

c++第5章 图形绘制

c++第5章 图形绘制

第5章图形绘制在Visual C++6.0中,掌握图形程序设计方法是非常重要的。

因为图形在任何一个可视化工程项目中都是不可缺少的。

CDC(设备环境)类封装了图形绘制所需要的各种操作。

本章我们将通过实际例子和较详细的阐述,来了解和掌握如何使用设备环境类(CDC)及图形设备接口(GDI)进行图形绘制。

5.1 设备环境与设备环境类(CDC)5.1.1 设备环境设备环境也称设备上下文(Device Context,简称DC),是计算机物理设备的代表,也是图形设备接口的主要组成部分。

由于Windows是一个与设备无关的操作系统,即Windows不允许直接访问硬件,如果用户想将文本和图形绘制到显示器或其它设备中去,必须通过“设备环境”这个抽象层与硬件进行通信,设备上下文对象的作用就是实现Windows的设备无关性,任何向屏幕上进行输出的功能都要间接地通过它来完成。

设备上下文是Windows的一种数据结构,它包含了有关如显示器或打印机等设备的绘图属性信息。

所有绘画都是通过设备上下文对象来实现的,该对象封装了Windows的画线、图形和文本的API函数。

设备上下文允许在Windows下独立于设备的绘画。

设备上下文不仅能够被用来在屏幕上绘画,它也可以将绘画输出到打印机和图元文件中。

5.1.2 设备环境类设备环境类CDC直接继承于CObject类,该类定义了一类设备对象。

CDC对象提供了非常多的成员函数,与设备环境的显示器、打印机等一起工作。

例如,如果要在显示器等设备上绘制图形,我们可以用MFC提供的设备环境类CDC类,因为CDC类中包含了绘图所需要的所有成员函数。

同时。

MFC还提供了以下几个CDC的派生类:1、CPaintDC类此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。

用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。

图形设备接口概述

图形设备接口概述
• MFC的DC类包括CDC、CPaintDC、CClientDC、 CWindowDC和CMetaFileDC等,其中CDC类是 MFC设备环境类的基类,其它的MFC设备环境类 都是CDC的派生类。
MFC设备环境类:
• CDC类既作为其它MFC设备环境类的基类,又可 以作为一个一般的设备环境类使用。利用它可以访 问设备属性和设置绘图属性。CDC类对GDI的所有 绘图函数进行了封装。
• CPaintDC类是OnPaint()函数使用的设备环境类, 它代表一个窗口的绘图画面。如果添加 WM_PAINT消息处理函数OnPaint(),就需要使用 CPaintDC类来定义一个设备环境对象。
• CClientDC类代表了客户区设备环境。当在客户区 实时绘图时,需要利用CClientDC类定义一个客户 区设备环境。
8.1.2 设备环境
• 为了实现设备无关性,应用程序的输出不直接面 向显示器等物理设备,而是面向一个称之为设备 环境DC(Device Context)的虚拟逻辑设备。
• 设备环境也称设备描述表或设备上下文,它是由 Windows管理的一个数据结构,它保存了绘图操 作中一些共同需要设置的信息,如当前的画笔、 画刷、字体和位图等图形对象及其属性,以及颜 色和背景等影响图形输出的绘图模式。
8.1 图形设备接口
• Windows提供了一个称为图形设备接口GDI (Graphics Device Interface)的抽象接口。GDI 作为Windows的重要组成部分,它负责管理用户 绘图操作时功能的转换。用户通过调用GDI函数 与设备打交道,GDI通过不同设备提供的驱动程 序将绘图语句转换为对应的绘图指令,避免了直 接对硬件进行操作,从而实现所谓的设备无关性。
• 形象地说,一个设备环境提供了一张画布和一些 绘画的工具,我们可以使用不同颜色的工具在上 面绘制点、线、圆和文本。

图形设备接口及绘图

图形设备接口及绘图

§3.2 图形设备接口(GDI)
1. 图形设备接口—提供专门的数据结构即设备描述表(DC)和对DC操 作的绘图函数。
2. 设备描述表(DC)—用于代表图形输出设备如显示屏、打印机;
3. 设备无关性—利用GDI,所有的绘图操作都对设备描述表而不是具体 的物理设备。
设备描述表
• 一种专门用于代表图形输出设备(如屏幕、打 印机和绘图仪等)的数据结构 –画布 –绘图工具(设备描述表属性)
hNewPen=(HPEN)SelectObject(hdc,hOldPen); DeleteObject(hNewPen); EndPaint(hWnd, &ps); break;
使用CGDIObject类
• 数据成员m_hObject • Attach函数 Detach函数 • 派生类: CPen、CBrush、CFont、
– yViewport=(yWindowyWinOrg)*(yViewExt/yWinExt)&ewportOrgEx函数
BOOL SetViewportOrgEx( HDC hdc, // 设备描述表句柄 int X, // 使用设备单位,视口原点的X坐标值 int Y, // 使用设备单位,视口原点的Y坐标值 LPPOINT lpPoint // 指向POINT结构变量,存放 原始的视口原点坐标
PAINTSTRUCT • typedef struct tagPAINTSTRUCT {
HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT
(2) EndPaint function

图形设备接口及绘图

图形设备接口及绘图

设备驱动层负责与具体的图形设 备进行交互,将GDI核心层发送的 图形指令转换为设备可以理解的 指令,并控制设备进行渲染。
GDI的结构主要包括三个层次:应 用程序接口层、GD负责将应用程序的图形 操作转换为相应的图形指令,并 管理图形设备的资源,如内存、 颜色表等。
技术创新方向预测
跨平台兼容性增强
随着不同操作系统和设备的普及,图形设备接口将更加注重跨平 台兼容性,实现无缝的跨平台用户体验。
实时渲染技术优化
借助更强大的计算能力和先进的算法,图形设备接口将进一步提高 实时渲染的质量和效率。
AI驱动的智能图形处理
结合人工智能技术,图形设备接口将实现更智能的图形处理,包括 自动优化、智能缩放、场景识别等功能。
图形设备接口及绘图
目录
• 图形设备接口概述 • 图形设备接口原理及结构 • 绘图基本操作与功能 • 高级绘图技巧与方法 • 图形设备接口在应用领域中的实践 • 图形设备接口未来发展趋势与挑战
01 图形设备接口概述
定义与功能
定义
图形设备接口(Graphics Device Interface,GDI)是一种应用程序编 程接口(API),用于在计算机图形环 境中表示图形和文字。
标准
为了规范GDI的开发和使用,国际标准化组织(ISO) 和国际电工委员会(IEC)等制定了一系列相关标准, 如OpenGL、DirectX等。这些标准为不同平台和设 备上的GDI实现提供了统一的接口和规范,促进了 GDI的互操作性和可移植性。
02 图形设备接口原理及结构
工作原理简介
图形设备接口(GDI)是计算机图形学中的一个重要概念, 它提供了一种与图形硬件设备进行交互的抽象层。
图像处理
反走样技术

VC++实验 windows绘图

VC++实验 windows绘图

实验4 Windows绘图实验目的1、掌握设备描述表2、掌握CDC类和CGDIObject类及其派生类的应用3、掌握CFont类的一个用4、定时器的应用与定时消息的处理实验内容:本节主要掌握Windows的绘图功能,主要内容包括图形设备接口、CDC类和CGDIObject 类、用CDC类进行图形绘制、用CGDIObject类的派生类CPen类和CBrush类进行绘图。

还讲述了用CGDIObject类的派生类CFont类设置字体以及用定时器实现简单的动画效果。

1.设备描述表设备描述表(Device Context)是一个用来确定任何设备的GDI出书的位置和形象属性的集合。

应用程序病不能直接访问设备描述表,但是应用程序可以使用设备描述表的句柄来间接地存取设备描述表及其属性。

创建的设备描述表包含了它所有的属性和默认值。

在Windows环境下,所有图形文字的输出都是基于坐标系统的,图形坐标系统与基于文本的函数所使用的坐标系统是一致的。

默认的坐标系统以用户区域的左上角为原点,向右的每一个像素表示沿正X轴的一个单位,向下的每一个像素表示沿正Y轴的一个单位。

3.绘图工具绘图工具包括画线的画笔、填充图形内部以及书写正文的字体工具。

所有这些工具的使用都要经过3个步骤,即建立工具、选择工具和使用完后删除相应的工具。

4.CDC类和CGDIObject类CDC类封装了Windows的DC(设备描述表),是MFC设备环境类的基类,其他的MFC设备环境类都是CDC类的派生类。

CDC类指针的生成是用GetDC()函数来实现的,CDC类指针的销毁是用ReleaseDC()函数来实现的。

如:CDC *pDC=GetDC();ReleaseDC(pDC);CGDIObject类及其派生类只封装了GDI中的部分实体,所以CGDIObject类和GDI并不具有想CDC类和DC那样的对应关系。

CGDIObject类具有以下几个主要派生类:CBitmap:位图CBrush类:画刷CPen类:画笔CPalette类:调色板CFont类:字体CRgn类:区域构造CGDIObject派生类的对象通用有两种方法:(一)一步构造法。

图形设备接口概述

图形设备接口概述

图形设备接口概述图形设备接口是计算机硬件设备与图形输出设备之间的连接和通信接口。

图形设备接口的主要作用是将计算机中的图形数据转换成适合输出设备的信号,并将其发送到输出设备上以显示图形图像或执行相关的图形操作。

图形设备接口通常包括以下几个方面的内容:1. 图形处理器:图形设备接口通常会包含一个图形处理器,用于处理计算机中的图形数据。

这些处理器通常会包含专门的图形处理芯片,用于加速图形数据的处理和输出。

2. 显示接口:图形设备接口还会包含一种用于电子设备之间传输图形数据的接口,在电脑显示器和计算机之间传输图形数据,一般有HDMI,VGA,DVI等接口形成一个显示功能。

3. 驱动程序:图形设备接口中还包含了一些用于驱动图形设备的软件程序,在计算机中运行。

这些驱动程序通常由设备制造商提供,用于确保图形设备能够正确地与计算机通信和协作。

4. 输出设备控制:图形设备接口还包含了一些控制输出设备的信号发送、操作和控制。

这些控制信号用于调整显示器的亮度、对比度、色彩等参数。

总之,图形设备接口是计算机硬件设备与图形输出设备之间进行通信的桥梁,它是保证计算机能够正确地输出图形图像的关键接口之一。

图形设备接口在计算机系统中起着至关重要的作用,它不仅仅是连接计算机和输出设备的通信桥梁,同时也能影响到系统的性能、图形处理能力和显示效果。

以下是一些进一步讨论的方向以及图形设备接口的相关内容:1. 图形设备接口的发展历史:历史上,图形设备接口的发展经历了多个阶段。

从最初的模拟VGA接口到后来的数字HDMI和DisplayPort接口,每一代接口的推出都代表着图形设备技术的飞速进步。

这种发展历程可以让我们更好地了解图形设备接口的发展趋势和未来发展方向。

2. 图形设备接口的标准化:随着图形设备的日益普及,图形设备接口的标准化变得尤为重要。

目前,HDMI、DisplayPort、DVI等标准接口已经成为了市场主流,他们相互之间有着一些差异和优势。

GDI编程 绘图

GDI编程 绘图

第8章 GDI编程1-绘图GDI(Graphics Device Interface,图形设备接口)是Windows操作系统的传统图形子系统,负责与设备无关的图形绘制,Win32 API为应用程序提供了丰富的绘图函数和功能,MFC对它们进行了C++类封装,参见图8-1。

图8-1 GDI与Windows操作系统(其中彩色部分为操作系统)于1985年11月推出的,新式GDI+则是随Windows XP于2001年10月推出的GDI的改进版,增加了α混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能。

随Windows Vista及.NET框架于2006年11月又推出了基于DirectX和.NET框架的全新图形子系统WPF(Windows Presentation Foundation,视窗显示/展现基础),它统一了桌面和浏览器等客户端应用程序的图形界面,采用XAML声明式编程,将用户界面的设计和编程彻底分离开来,是Windows的下一代GUI显示系统。

本书从第8章到第11章,将详细讨论如何使用GDI进行传统的Windows图形编程,包括绘图、文字、图像、动画、图标、图元文件和打印等内容。

GDI+是建立在GDI之上的,计划在第14和15章中作简单介绍。

WPF则是以.NET框架为基础的,准备在第19上和20章中再加以讨论。

在MFC应用程序中,绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw 中进行,例如:void CDrawView::OnDraw(CDC* /*pDC*/) {CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码}每次需要重绘窗口时(如程序启动、窗口大小改变、全部或部分窗口重现、程序员调用函数RedrawWindow 或Invalidate/UpdateWindow ),应用程序框架都会调用此CWnd 消息响应成员函数(的覆盖)来绘制窗口客户区。

第三章MFC绘图

第三章MFC绘图

7/22/2013
18
6.OnDraw与OnPaint的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint是 CWnd类的成员函数,响应WM_PAINT消息。 CView默认调用的OnPaint函数如下
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); //调用了OnDraw }
3.4重绘
为什么要重绘? 如何重绘? 在ondraw中重新绘制窗口内容: 把OnLButtonDown事件中的绘制图形 代码写在ondraw函数中。
7/22/2013
28
新的问题: 1)程序一开始就把OnLButtonDown事件 中绘制的图形画好了。 解决办法: 使用if控制:如果没有发生 OnLButtonDown事件,则不在ondraw中 重绘。 怎么实现?
文本:以图形方式输出文本,以逻辑坐标为单位计算输 出位置,而DOS是以行为单位。用户可以设置文本的各 种效果,如加粗、斜体、设置颜色等。
7/22/2013
3
2.设备上下文
应用程序的输出面向设备环境(Device Context,DC),是 一个虚拟逻辑设备,也称设备描述表或设备上下文。设备 环境DC 是由GDI 创建,用来代表设备连接的数据结构。 DC 的主要功能
7/22/2013
17
5.Windows系统发送WM_PAINT消息的时机
第一次创建一个窗口时 改变窗口的大小时 把窗口从另一个窗口背后移出时 窗口显示数据变化时,应用程序引发重绘操作
通过CWnd::Invalidate、CWnd::InvalidateRect或 CWnd::InvalidateRgn函数把指定区域加到窗口的 Update Region中。 窗口的Update Region不为空时,系统会自动产生 WM_PAINT消息。

一、操作系统特征多道程序设计技术可以极大地提高计算机资源(CPU

一、操作系统特征多道程序设计技术可以极大地提高计算机资源(CPU

一、操作系统特征多道程序设计技术可以极大地提高计算机资源(CPU、I/O设备等)的利用率,但它也改变了程序的工作环境,使程序由顺序执行变成并发执行,因此带来一些新的复杂问题,使得现代操作系统具有如下一些特征:并发性(Concurrence)并行性和并发性是既相似又有区别的两个概念。

并行性是指两个或多个事件在同一时刻发生,而并发性是指两个或多个在同一时间间隔内发生。

在多道程序环境下,并发性是指宏观上在一段时间内有多道程序在同时执行。

但在单处理机系统中,每一个时刻仅能执行一道程序,故微观上,这些程序是在交互执行。

2.共享性(Sharing)共享是指系统中的所有资源(如CPU、内存、I/O设备及软件资源)不再为一个程序所独占,而是供同时存在于系统中的多道程序所共同使用。

根据资源属性不同,可有互斥共享和同时共享两种不同的共享方式。

并发和共享是操作系统的两个最基本的特性,它们又是互为存在条件。

一方面资源共享是以程序(进程)的并发性执行为条件的,若系统不允许程序并发执行,自然不存在资源共享问题。

另一方面若系统不能对资源共享实施有效管理,则也必将影响到程序并发执行。

虚拟性(Virtual)虚拟是指通过某种技术把一个物理实体变成若是个逻辑上的对应物。

物理实体是实际存在的,是实的;逻辑物体是用户感觉到的,是虚拟的。

例如在单CPU多道分时系统中,通过多道程序技术和分时技术可以把一个物理CPU虚拟为多个逻辑上的CPU,使每个终端用户都认为有一台“独立”的CPU为它运行,用户感觉的CPU是虚拟CPU。

异步性(Asynchronism)和不确定性(nondeterministic)在多道程序环境下,允许多个程序并发执行,但由于资源等因素的限制,程序的执行并非“一气呵成”,而是以“走走停停”的方式运行,即程序是以异步方式运行的。

多个程序异步并发执行带来了二种不确定性。

一种是每个程序(进程)执行的速度和时间不确定,各程序(进程)之间推进的序列也不确定。

什么是GDI+?

什么是GDI+?

什么是GDI+?什么是GDIGDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。

在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。

GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。

1.引言GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。

顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。

作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离.从而使开发人员编写设备无关的应用程序变得非常容易。

2.GDI+新增功能(1)渐变的画刷(Gradient Brushes)GDI+允许用户创建一个沿路径或直线渐变的画刷,来填充外形(shapes),路径(paths),区域(regions),渐变画刷同样也可以画直线、曲线、路径,当你用一个线形画刷填充一个外形(shapes)时,颜色就能够沿外形逐渐变化。

(2)基数样条函数(Cardinal Splines)GDI+支持基数样条函数,而GDI不支持。

第07课 - 绘图工具

第07课 - 绘图工具

5
设备环境句柄
Windows程序设计-基础教程
HDC 设备环境句柄
HDC 是数据类型 HDC 代表了程序当前显示设备
HDC的用途:在程序中代表显示设备 在绘图时,必须要指定一个设备环境(DC),用 来将某个窗口或设备与设备环境类的句柄指针关 联起来,所有的绘图操作都与该句柄有关。 HDC的获得
绘图消息
Windows程序设计-基础教程
WM_PAINT
所有的绘图操作都在该消息下产生 窗口刷新的时候产生该消息
• 如:窗口尺寸发生变化、窗口被其他窗口覆盖
函数:
InvalidateRect 执行的时候产生该消息 使用例子: InvalidateRect(hWnd,NULL,TRUE);
4
GDI特点
Windows程序设计-基础教程
GDI特点:
不需要程序直接访问物理显示硬件,通过称为“设备 环境”的抽象接口,间接访问显示硬件; 程序需要与显示硬件(显示器、打印机等)进行通讯 时,必须首先获得与特定窗口相关联的设备环境; 用户无需关心具体的物理设备类型; Windows参考设备环境的数据结构完成数据的输出。
*矩形绘制
Windows程序设计-基础教程
BOOL Rectangle( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
*绘制椭圆
Windows程序设计-基础教程
BOOL Ellipse( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);

图形设备接口DirectX 图形接口指南

图形设备接口DirectX 图形接口指南

图形设备接口:DirectX 图形接口指南疯狂代码 / ĵ:http://GameDevelopment/Article35957.html译者申明:这些指南是我在阅读 DirectX8.1 SDK 中逐步翻译出来对于初次接触 DirectX Graphics 编程者而言这应该是很好上手资料其实本人就是从这些指南开始深入 Direct3D8.1 ;由于这是本人第次翻译英文材料言语不通词不达意的处定很多些术语也译得很勉强请见谅此外需要转载此文者请保留以下部分:-----------------------------------------------------------------------DirectX图形接口指南 译者:In355Hz 电子邮箱: In355Hz@-----------------------------------------------------------------------DirectX 图形接口指南:(应用于 DirectX 8.1 版 C/C 编程)本区域指南将介绍说明如何在 C/C 中使用 Microsoft Direct3D 和 Direct3DX 完成些普通工作这些工作总是被分解成若干个必要步骤在某些情况下为了使表达更清楚些步骤还被细分成几个子步骤本区域提供指南有:· 指南:创建设备· 指南 2:演示顶点· 指南 3:使用矩阵· 指南 4:创建和使用光源· 指南 5:使用纹理映射· 指南 6:使用Mesh模型提示:指南中出现举例代码来自于每个指南具体提供路径里源文件这些指南中源代码是用 C 写成如果使用C编译器你必须适当改变这些文件使它们能够编译通过最少你需要加入vtable 然后用它引用接口包含在举例代码中些注解可能和来自 Microsoft Platform Software Development Kit (SDK) 中源代码区别这些改变仅仅为了简化表述并且只限于注解中这样能够防止举例行为被改变指南:创建设备为了使用 Microsoft Direct3D你首先需要创建个应用窗口并紧接着创建和化 Direct3D 对象你应该使用这些对象提供 COM 接口来操纵它们以及创建描绘个场景所必需其它对象本指南包含 CreateDevice 举例将例示并介绍说明以下几个工作:创建 Direct3D 设备并且绘制个简单蓝色屏幕这个指南使用以下步骤:化 Direct3D绘制场景以及最后清理和关闭·步骤:创建个窗口·步骤 2:化 Direct3D·步骤 3:处理系统消息·步骤 4:绘制和显示场景·步骤 5:关闭和清除注意:CreateDevice 举例路径在:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut01_CreateDevice.步骤:创建个窗口任何 Microsoft Windows 执行中必须要作第件事就是创建个应用窗口并将其显示给用户为做到这点CreateDevice 例程将首先实现它 WinMain 以下举例代码完成了窗口化INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ){// Register the window .WNDCLASSEX wc = { (WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,GetModuleHandle(NULL), NULL, NULL, NULL, NULL,"D3D Tutorial", NULL };RegisterClassEx( &wc );// Create the application's window.HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,GetDesktopWindow, NULL, wc.hInstance, NULL );前述举例代码是标准 Windows 编程例子开始时定义和注册了个窗口类名为 "D3D Tutorial"类注册以后举例代码使用已注册类创建了个基本顶层(top-level)窗口客户区域为 300 像素宽300 像数高这个窗口没有菜单或子窗口举例使用了 WS_OVERLAPPEDWINDOW 属性创建个包括最大化最小化以及关闭按钮普通窗口(如果该例程将运行在全屏模式下首选窗口属性应该是WS_EX_TOPMOST它指定创建窗口置于并且保持在所有非最高(non-topmost)窗口的前甚至在窗口失活情况下)旦窗口创建完成例代码标准 Microsoft Win32 显示和更新窗口在应用窗口准备好以后你就能开始设置具体 Microsoft Direct3D 对象了请见:步骤 2:化 Direct3D步骤 2:化 Direct3DCreateDevice 举例在 WinMain 中创建窗口的后该定义 InitD3D 完成 Microsoft Direct3D 化过程在创建窗口的后已经准备好化你将用来绘制场景 Direct3D 对象了这个过程包括创建个 Direct3D 对象设置Present Parameters以及最后创建 Direct3D 设备创建完 Direct3D 对象的后你可以立即使用 IDirect3D8::CreateDevice 思路方法创建 Direct3D 设备你也能够使用 Direct3D 对象枚举设备类型模式以及其他东西这些工作代码段应位于使用 Direct3DCreate8 创建Direct3D 对象的后( NULL ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )E_FAIL;传递给 Direct3DCreate8 唯参数应该始终是 D3D_SDK_VERSION它告诉 Direct3D 当前使用头文件信息无论如何头文件或者其他变化将导致这个值增加并强制使用该值应用重新编译如果此版本不匹配 Direct3DCreate8将失败下个步骤是使用 IDirect3D8::GetAdapterDisplayMode 接口找到当前显示模式代码如下:D3DDISPLAYMODE d3ddm;( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )E_FAIL;D3DDISPLAYMODE 结构中 Format 变量将被用于创建 Direct3D 设备如果是运行于窗口模式下话Format 参数通常用来创建个和适配器当前模式相匹配后背缓冲 (Back buffer)在给 D3DPRESENT_PARAMETERS 各参数赋值时你必须指定你应用在3D下工作方式本 CreateDevice 例程设置D3DPRESENT_PARAMETERS结构中 Windowed 为 TRUESwapEffect 为D3DSWAPEFFECT_DISCARDBackBufferFormat 为 d3ddm.FormatD3DPRESENT_PARAMETERS d3dpp;ZeroMemory( &d3dpp, (d3dpp) );d3dpp.Windowed = TRUE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = d3ddm.Format;最后步是利用 IDirect3D8::CreateDevice 创建 Direct3D 设备代码如下:( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice ) ) )前述代码使用 D3DADAPTER_DEFAULT 标志创建了个使用省缺适配器设备在非常多数情况下系统只有个适配器除非它安装了多个图形加速卡通过把 DeviceType 参数设成 D3DDEVTYPE_HAL表示你希望获得个实际硬件设备 (hardware device) 而不是软件Software虚拟设备 (software device)举例代码还使用D3DCREATE_SOFTWARE_VERTEXPROCESSING 标志通知系统使用软件Software顶点处理 (software vertex processing)注意如果你指定 D3DCREATE_HARDWARE_VERTEXPROCESSING 标志通知系统使用硬件顶点处理 (hardware vertex processing),你可以在支持硬件顶点处理图形加速卡上得到大幅度性能提升现在 Direct3D 已经化完毕下步是确保你具有个机制用来来处理系统消息见下文:步骤 3:处理系统消息步骤 3:处理系统消息完成创建窗口以及化 Direct3D 以后你已经准备好绘制场景 (Render scene)大多数情况下Microsoft Windows 在它们消息循环里监视系统消息并且在队列里没有消息时绘制画面帧然而CreateDevice 例程仅仅在等到个WM_PAINT出现在队列里时才通知应用重绘窗口所有部分// The message loop.MSG msg;while( GetMessage( &msg, NULL, 0, 0 ) ){TranslateMessage( &msg );DispatchMessage( &msg );}当每循环次DispatchMessage MsgProc后者负责处理队列里消息当 WM_PAINT 消息进队时该自身定义Render它将负责重绘窗口然后 Microsoft Win32 ValidateRect 执行并将整个客户区域设为有效消息处理例代码如下:LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) {switch( msg ){WM_DESTROY:PostQuitMessage( 0 );0;WM_PAINT:Render;ValidateRect( hWnd, NULL );0;}DefWindowProc( hWnd, msg, wParam, lParam );}现在应用处理了系统消息接着步是绘制显示见:步骤 4:绘制和显示场景步骤 4:绘制和显示场景为了描绘和显示需要场景本例程在这步把后背缓冲 (back buffer) 填充为蓝色然后将此后背缓冲内容传给前景缓冲 (front buffer), 并且将前景缓冲提交至屏幕清除表面应 IDirect3DDevice8::Clear :// Clear the back buffer to a blue colorg_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );Clear 接受前两个参数通知 Microsoft Direct3D 被清除矩形区域基址和大小该矩形区域描述了绘制目标表面(render target surface) 里需要清除区域在大多数情况下只使用单个矩形覆盖整个绘制目标表面这样你只需设置第个参数为 0 及第 2个参数为 NULL第3个参数将决定思路方法行为你可以通过设置特定标志用来清除绘制目标表面 (render target surface)关联Z缓冲 (associated depth buffer)模版缓冲 (stencil buffer)以及任意这 3者混合本指南不使用Z缓冲所以仅仅使用了 D3DCLEAR_TARGET 标志最后 3个参数分别用于设置对应绘制目标表面、Z缓冲和模版缓冲清除填充值(reflect clearing values)该 CreateDevice 例程将绘制目表面清除填充色设置为蓝色(D3DCOLOR_XRGB(0,0,255)由于相应标志没有设置最后两个参数被 Clear 忽略在清除了视口 (viewport) 的后CreateDevice 例程告知 Direct3D 绘图将要开始然后立即通知这次绘制完成见以下代码段:// Begin the scene.g_pd3dDevice->BeginScene;// Rendering of scene objects happens here.// End the scene.g_pd3dDevice->EndScene;当绘制开始或完成时IDirect3DDevice8::BeginScene 和 IDirect3DDevice8::EndScene 将用信号通知系统你只能在这两的间其它绘图即使绘图失败你也应该在重新 BeginScene 的前 EndScene绘制完的后 IDirect3DDevice8::Present显示该场景:g_pd3dDevice->Present( NULL, NULL, NULL, NULL );Present 接受前两个参数是原始矩形和目标矩形在这步例程设置这两个参数为 NULL 并把整个后备缓冲提交到前景缓冲第 3个参数用于设置该次提交目标窗口这个参数被设为 NULL实际使用窗口是D3DPRESENT_PARAMETERS hWndDeviceWindow 成员第 4个是 DirtyRegion 参数在绝大多数情况下应该设为 NULL本指南最终步骤是关闭应用见:步骤 5:关闭和清除步骤 5:关闭和清除在执行若干时刻你应用必须立即关闭关闭个 Direct3D 应用中不只是意味着你必须销毁窗口并且你还要释放中使用过任何 Direct3D 对象并且无效化它们指针当收到个 WM_DESTROY 消息时CreateDevice 例程通过个本地定义 Cleanup 来处理这些工作VOID Cleanup{( g_pd3dDevice != NULL)g_pd3dDevice->Release;( g_pD3D != NULL)g_pD3D->Release;}上述对每个对象 IUnknown::Release 思路方法来释放它们自身由于DirectX遵循 COM 规则大多数对象当其引用计数降为0时DirectX会自动从内存中释放这个对象对于其他关闭情况可能发生在平常执行中——比如用户改变了桌面参数或色深——此时你可能需要撤销和重建使用中 Microsoft Direct3D 对象因此个好主意就是将你释放代码放到起以便能在需要时随时它本指南已经介绍说明了如何创建个设备指南 2:演示顶点(Render Vertex) 将告诉你如何用顶点(Vertex)创建几何形体指南 2:演示顶点(Render Vertex)Microsoft Direct3D 写应用使用顶点(Vertex)构造几何物体每个 3维空间 (3D) 场景包括个或几个这样几何物体Vertices 例程构造简单物体个 3角形并且将它绘制到显示屏上本指南介绍说明如何采用以下步骤从顶点构造个 3角形:·第步:定义个自定义顶点类型·第 2步:设置顶点缓冲·第 3步:绘制至显示屏注意:Vertices 举例路径为:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut02_Vertices.Vertices 举例代码和 CreateDevice 代码大部分相同本“演示顶点(Render Vertex)”指南仅仅关注于那些独特有关顶点代码而不包括化 Direct3D处理 Microsoft Windows 消息绘图和清理等工作如要得到有关这些任务信息请参考 指南:创建设备第步:定义个自定义顶点类型Vertices 例程使用 3个顶点构造个 2D 3角形这里提及了顶点缓冲概念这是用于保存和演示大量顶点 Microsoft Direct3D 对象通过指定个自定义顶点结构和相应可变向量格式 (FVF)顶点能够采用很多思路方法定义本Vertices 例程使用顶点格式定义于以下代码片断中struct CUSTOMVERTEX{FLOAT x, y, z, rhw; // The transformed position for the vertex.DWORD color; // The vertex color.};上面结构体介绍说明了自定义顶点类型格式下步是定义 FVF 以描述顶点缓冲区中顶点内容以下代码片段定义了个 FVF 并符合此上建立自定义顶点类型# D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)可变顶点格式标记描述了使用中自定义顶点类型前述举例代码使用了 D3DFVF_XYZRHW 和D3DFVF_DIFFUSE 标志这将告诉顶点缓冲自定义顶点类型包含组转换过点坐标并紧跟着个颜色参数现在自定义向量格式和 FVF 已经被指定好了下步将使用顶点填充顶点缓冲区请参看:第 2步:设置顶点缓冲注意:Vertices 例程中顶点是转换过用另句话说它们已经在 2D 窗口坐标系下这意味着座标点 (0,0) 位于左上角且正 x 半轴向右正 y 半轴向下这些顶点同样也是光照过这介绍说明它们着色不通过 Direct3D 照明而由它们自己颜色代替第 2步:设置顶点缓冲现在自定义顶点格式已经完成化顶点时候到了 Vertices 例程创建了必需 Microsoft Direct3D 对象的后本内部定义 InitVB 进行这个工作以下代码段将化 3个自定义顶点值CUSTOMVERTEX g_Vertices ={{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },};前述代码片段采用 3角形 3个顶点填充 3个Vertex并指定了每个顶点散射光颜色第个顶点位于 (150,50) 散射红色 (0xffff0000)第 2个顶点位于 (250,250) 为绿色 (0xff00ff00)第 3点位于 (50,250) 并散射蓝绿色(0xff00ffff)每点都具有相同 0.5 Z值及 1.0 RHW 参数有关这些矢量格式其它信息见 SDK: Transformed and Lit Vertices下步将 IDirect3DDevice8::CreateVertexBuffer 创建顶点缓冲区如以下代码段所示:( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*(CUSTOMVERTEX),0 /* Usage */, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVB ) ) )E_FAIL;CreateVertexBuffer 头两个参数告诉 Direct3D 新顶点缓冲区预计大小和使用方法紧跟两个参数指定新缓冲区矢量格式及存储位置这里向量格式是 D3DFVF_CUSTOMVERTEX就是例程先前定义 FVF 值D3DPOOL_DEFAULT 标记告诉 Direct3D 在最合适位置创建此顶点缓冲区最后个参数返回创建完成顶点缓冲区对象地址创建了顶点缓冲区的后如以下代码段所示开始采用自定义格式顶点填充缓冲区中数据VOID* pVertices;( FAILED( g_pVB->Lock( 0, (g_Vertices), (BYTE**)&pVertices, 0 ) ) )E_FAIL;memcpy( pVertices, g_Vertices, (g_Vertices) );g_pVB->Unlock;首先 IDirect3DVertexBuffer8::Lock 锁定顶点缓冲区第个参数是锁定顶点数据偏移量按字节计算第 2个参数是需锁定顶点数据长度同样按字节计算第 3个参数是个 BYTE 类型指针地址用于返回指向顶点数据地址第 4个参数告知顶点缓冲区如何锁定数据通过使用 memcpy顶点被复制到顶点缓冲区里将顶点放入缓冲区的后次 IDirect3DVertexBuffer8::Unlock 以解锁顶点缓冲区这个锁定——解锁机制是必需正在使用顶点缓冲区可能位于设备内存中现在顶点缓冲区已经填入顶点绘制到显示时候到了见描述:第 3步:绘制至显示屏第 3步:绘制至显示屏现在缓冲区已经填入顶点现在需要把它绘制到显示屏上在绘制到屏幕的前先将背景清除为蓝色并 BeginSceneg_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0L );g_pd3dDevice->BeginScene;从顶点缓冲区绘制顶点数据需要些步骤首先你需要设置流数据源;在当前情况下使用第 0 个流 流数据源是通过IDirect3DDevice8::SetStreamSource 设置g_pd3dDevice->SetStreamSource( 0, g_pVB, (CUSTOMVERTEX) );SetStreamSource 第个参数告诉 Microsoft Direct3D 设备设置数据流索引第 2个参数是绑定在该数据流上顶点缓冲区第 3个参数是数据单元大小用字节数表示在上面举例代码中将使用CUSTOMVERTEX 大小作为数据单元大小下步通过 IDirect3DDevice8::SetVertexShader 使 Direct3D 了解使用中顶点处理器(Vertex Shader)就整体而言自定义顶点处理器是种高级话题但是在绝大多数情况下顶点处理器仅仅等于 FVF 代码这能够让 Direct3D 知道处理中顶点类型以下代码片段将FVF设置为当前顶点处理器:g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );SetVertexShader 唯参数是当前设置顶点处理器句柄这个参数值可以是从IDirect3DDevice8::CreateVertexShader 返回句柄或者是 FVF 代码在这儿使用参数是定义为D3DFVF_CUSTOMVERTEX FVF 代码有关顶点处理器更多信息请见 SDK: Vertex Shader 章下步使用 IDirect3DDevice8::DrawPrimitive 绘制顶点缓冲区中顶点见以下代码片段:g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );DrawPrimitive 接受第个参数是个标记它通知 Direct3D 绘制哪种类型物件(Primitive)本例程使用D3DPT_TRIANGLELIST 标记指定为 3角形序列第 2个参数是第个顶点索引第 3个参数通知绘制物件数目本例子只画个 3角形这个值为 1有关区别种类物件更多信息可见 SDK: 3-D Primitive最后步是结束场景并立即将后背缓冲提交为前景缓冲这些写在以下代码片段中:g_pd3dDevice->EndScene;g_pd3dDevice->Present( NULL, NULL, NULL, NULL );当后背缓冲被提交为前景缓冲后客户窗口将显示出个 3个点颜色各异 3角形本指南已经指导你如何使用顶点构造几何外形了指南 3:使用矩阵 将介绍矩阵概念以及如何使用它们指南 3:使用矩阵本指南介绍矩阵概念及演示如何使用它们Vertices 例程通过呈递2D顶点画出了个 3角形然而在这个指南中你将通过顶点变换在 3-D 环境下工作矩阵和变换也同样用于设置摄影头和视口(Viewport)在 Matrices 例程呈递几何物体的前它自定义 SetupMatrices 创建并设置用于演示 3-D 3角形矩阵变换作为代表 3种类型变换同时被设置到个 3-D 场景创建这些典型变换步骤如下表:·第步:定义世界变换矩阵·第 2步:定义观察变换矩阵·第 3步:定义映射变换矩阵注意:Matrices 举例路径为:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut03_Matrices.创建这 3种变换顺序并不影响场景元素输出无论如何Direct3D 都使用以下顺序依次将矩阵作用于场景:(1) 世界(2) 观察(3) 映射Matrices 工程举例代码几乎和 Vertices 工程代码相同该“使用矩阵”指南仅仅关注那些有关矩阵独特代码而不重复化 Direct3D处理 Microsoft Windows 消息演示以及清除有关这些工作信息请见 指南:创建设备本指南使用自定义顶点格式和单个顶点缓冲区呈递几何模型有关更多有关选择自定义顶点类型以及执行顶点缓冲区信息见 指南 2:演示顶点第步:定义世界变换矩阵(World Transformation Matrix)世界变换矩阵定义了怎样转换、缩放、以及旋转 3-D 模拟空间中几何物体以下代码片段为 Microsoft Direct3D 设备设置当前世界变换并且使 3角形绕 y-轴 旋转D3DXMATRIX matWorld;D3DXMatrixRotationY( &matWorld, timeGetTime/150.0f );g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );第步是通过 D3DXMatrixRotationY 使 3角形绕 y-轴 旋转第个参数是指向 D3DMATRIX 结构指针用于返回操作结果第 2个参数是以弧度表示旋转角度下步是 IDirect3DDevice8::SetTransform 给 Direct3D 设备设置世界变换SetTransform 接受第个参数通知Direct3D 被设置是哪个转换这个例子用 D3DTS_WORLD 宏指定被设置是世界变换第 2个参数是个指向被设为当前变换的矩阵指针有关世界变换更多信息见:SDK: World Transformation定义完场景世界变换后你可以准备观察变换矩阵了再次请注意:定义任变换顺序不是关键无论如何Direct3D 采用以下顺序将这些矩阵作用于场景:(1) 世界(2) 观察(3) 映射定义观察变换矩阵请参看 第 2步:定义观察变换矩阵第 2步:定义观察变换矩阵(View Transformation Matrix)观察变换矩阵定义了观察位置和旋转角度此观察矩阵就相当于场景摄影机以下代码片段创建了个观察变换矩阵并将其设置为 Microsoft Direct3D 设备当前观察矩阵D3DXMATRIX matView;D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f ),&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );第步是通过 D3DXMatrixLookAtLH 定义观察矩阵第个参数是个指向 D3DXMATRIX 结构指针用来接受操作结果第 2、 3、 4个参数定义了观察点、注视点、以及方向“上”这儿设置观察点为沿 Z-轴 反方向 5 单位再往上3 单位注视点为原点以及作为“上”方向为 Y-轴下步是 IDirect3DDevice8::SetTransform 给 Direct3D 设备设置观察矩阵SetTransform 接受第个参数通知Direct3D 哪个变换将要被设置该例程使用 D3DTS_VIEW 标记指定为观察矩阵第 2个参数是个指向矩阵指针它被设为当前变换有关观察矩阵更多信息见:SDK: View Transformation定义了场景世界变换后你可以开始准备映射变换矩阵了再次提醒定义每变换顺序不是关键性无论如何Direct3D 总是采用以下顺序将矩阵应用于场景:(1) 世界(2) 观察(3) 映射定义映射变换矩阵工作被描述在 第 3步:定义映射变换矩阵第 3步:定义映射变换矩阵(Projection Transformation Matrix)映射变换矩阵定义了将 3-D 观察空间转换为 2-D 视口空间几何学思路方法以下代码片段创建映射变换矩阵并将其设为 Microsoft Direct3D 设备当前映射变换D3DXMATRIX matProj;D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );第步是 D3DXMatrixPerspectiveFovLH 设置映射矩阵第个参数是个指向 D3DXMATRIX 结构用于接受操作结果第 2个参数定义视场它介绍说明物体如何随着距离而缩小个典型视场是 1/4 π就像这个例子使用样第 3个参数定义了屏幕纵横比本举例采用典型纵横比 1第 4和第 5个参数定义最近和最远剪切平面这是用于确定位于何种距离的外几何物体无需再绘制本 Matrices 举例设置它最近剪切平面为 1最远剪切平面为 100下步是 IDirect3DDevice8::SetTransfrom 对 Direct3D 应用变换SetTransfrom 接受第个参数通知 Direct3D 何种变换被设置本例程使用 D3DTS_PROJECTION 标志指定映射变换将被设置第 2个参数是个指向矩阵指针它将被设置为当前变换有关映射变换更多信息参见:“映射变换”本指南已经提示你如何使用矩阵指南 4:创建和使用光源 将揭示如何在你场景中添加光源以增加真实性指南 4:创建和使用光源Microsoft Direc3D 光照系统给 3-D 物体提供更多真实性当使用它时每个场景中几何对象将被照亮基于它们位置和使用光源类型这个指南例程将介绍有关光照和材质主题本指南包含以下步骤用于创建材质和光照:·第步:创始化场景几何·第 2步:设置材置和光照注意:Lights 举例路径为:(SDK root)\\Samples\\Multimedia\\Direct3D\\Tutorials\\Tut04_Lights.注意:Lights 例程中代码和 Matrices 例程代码几乎完全样“创建和使用光源”指南仅仅关注于有关创建和使用光照独特代码而并不重复有关设置 Direct3D处理 Microsoft Windows 消息绘制或者清理内容有关这些任务其他信息见:指南:创建设备本指南使用自定义顶点和顶点缓冲区呈递几何形体有关选择个自定义顶点格式并执行顶点缓冲更多信息见:指南2:演示顶点本指南采用矩阵变换几何对象有关矩阵和变换更多信息参见:指南 3:使用矩阵第步:创始化场景几何使用光照个前提是每个表面都应该有法向量为此Lights 例程使用个稍微区别自定义顶点格式新自定义顶点格式具有个 3-D 位置坐标和个表面法向量这个表面法向量被用于 Microsoft Direct3D 光照计算核心struct CUSTOMVERTEX{D3DXVECTOR3 position; // The 3-D position for the vertex.D3DXVECTOR3 normal; // The surface normal for the vertex.};// Custom FVF.# D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)现在适当矢量格式定义好了Lights 例程 InitGeometry个自定义以创建个圆柱体最初步骤是创建个顶点缓冲区并用它保存这个圆柱体各点如以下例代码所示:// Create the vertex buffer.( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*(CUSTOMVERTEX),0 /* Usage */, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVB ) ) )E_FAIL;下步是使用圆柱体顶点填充顶点缓冲区注意下面举例代码每个点都被定义了个位置和个法向量for( DWORD i=0; i<50; i ){FLOAT theta = (2*D3DX_PI*i)/(50-1);pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );pVertices[2*i+0].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );pVertices[2*i+1].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );}在前述例程使用圆柱体顶点填充了顶点缓冲区的后这个顶点缓冲区已经准备好用于呈递了但是首先这个场景材质和光照必须在绘制圆柱体的前被设置这些描述在 第 2步:设置材质和光照第 2步:设置材质和光照为了在 Microsoft Direct3D 中使用光照你必须创建个或多个光源为了确定个几何物体放射何种颜色光线材质必须被创建于绘制几何对象在绘制这个场景的前Lights 例程 SetupLights个自定义来设置材质和个方向性光源创建种材质材质被定义为当束光照到几何物体表面后反射出颜色以下代码片段使用 D3DMATERIAL8 结构来创建个黄色材质D3DMATERIAL8 mtrl;ZeroMemory( &mtrl, (D3DMATERIAL8) );mtrl.Dfuse.r = mtrl.Ambient.r = 1.0f;mtrl.Dfuse.g = mtrl.Ambient.g = 1.0f;mtrl.Dfuse.b = mtrl.Ambient.b = 0.0f;mtrl.Dfuse.a = mtrl.Ambient.a = 1.0f;g_pd3dDevice->SetMaterial( &mtrl );这个材质漫射光颜色和环境光颜色都被设为黄色对 IDirect3DDevice8::SetMaterial 将应用此材质到用于绘制场景 Microsoft Direct3D 设备SetMaterial 接受唯参数是设置材质指针在这个完成以后每个物件都将使用这个材质绘制直到另次对 SetMaterial 指定了个区别材质为止现在材质已经被应用到场景下个步骤是创建光源创建个光源Microsoft Direct3D 里有 3种可用光源:点光源方向形光源和聚光灯光源本举例代码创建个方向形光源它向个方向发光并且不停变换发光方向下列代码片段使用 D3DLIGHT8 结构创建个方向性光源D3DXVECTOR3 vecDir;D3DLIGHT8 light;ZeroMemory( &light, (D3DLIGHT8) );light.Type = D3DLIGHT_DIRECTIONAL;下列代码片设置光源漫射光为白色light.Dfuse.r = 1.0f;light.Dfuse.g = 1.0f;light.Dfuse.b = 1.0f;以下代码片在个环内旋转光源方向vecDir = D3DXVECTOR3(cosf(timeGetTime/360.0f),0.0f,sinf(timeGetTime/360.0f) );D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );对 D3DXVec3Normalize 将归化方向矢量并化光源方向可以设置个范围告诉 Direct3D 此光源能影响多远距离这个成员参数对方向性光源无效以下代码片指定此光源范围为 1000 单位light.Range = 1000.0f;下面代码片将这个光源分配到当前 Direct3D 设备通过 IDirect3DDevice8::SetLightg_pd3dDevice->SetLight( 0, &light );SetLight 接受第个参数是此光源被分配索引号注意如果在此索引已存在个光源它将被新光源覆盖第 2个参数是个指向新定义光源数据结构指针本 Lights 例程设置这个光源位于 0 号索引下列代码片激活这个光源通过 IDirect3DDevice8::LightEnableg_pd3dDevice->LightEnable( 0, TRUE);LightEnable 接受第个参数是激活光源索引第 2个参数是个布尔量通知此光源是开 (TRUE) 还是闭 (FALSE)在上面例程中索引 0 上光源被打开以下代码片通知 Direct3D 呈递此光源通过 IDirect3DDevice8::SetRenderStateg_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );SetRenderState 接受头两个参数是哪个设备状态变量被改写以及写入何种值本例程设置 D3DRS_LIGHTING 设备变量为 TRUE这将使设备能够演示光照效果本例程最后步是通过再次 SetRenderState 打开环境照明光g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );当前代码段设置 D3DRS_AMBIENT 设备变量为种浅灰色 (0x00202020)环境照明将使用所给颜色照亮所有物体有关照明及材质更多信息参见 SDK: Lights and Materials本例程向你介绍说明了如何使用照明和材质指南 5:使用纹理映射 将向你介绍说明如何将纹理添加到物体表面上指南 5:使用纹理映射尽管光照和材质大大增加了场景真实感但没有比在表面上添加纹理更能增加真实感了纹理能够被想象为层紧紧包装在表面贴纸你能在个立方体上放置层木质纹理使它看起来就象用木头制成样本 Texture 例程将在 指南 4:创建和使用光照 中构造圆柱上添加幅类似香蕉纹理此指南介绍内容包括如何载入纹理设置纹理和呈递带有纹理物体本指南采用以下步骤实现纹理:·第步:定义个定制顶点格式·第 2步:化屏幕几何·第 3步:演示场景。

第七章 绘图与打印

第七章 绘图与打印

CDC类的派生类
CPaintDC : CPaintDC 对 象 只 在 响 应 WM_PAINT消息时,在OnPaint消息处理函数 中使用。 CClientDC:客户区的实时响应般在响应非 窗口重画消息(如键盘输入时绘制文本、鼠 标绘图)绘图时要用到它. CWindowDC:整个窗口的响应(包括非客 户区)除非要自己绘制窗口边框和按钮(如 一些CD播放程序等),否则一般不用它.
字体
CFont类对象用于输出文字时选用不同风格和大小的 字体。可选择的风格包括:是否为斜体,是否为粗 体,字体名称,是否有下划线等。 颜色和背景色不属于字体的属性。 CFont类:只有一个构造函数; 成员函数CreateFont
成员函数CreateFont
CreateFont(int nHeight, //逻辑字符高度; int nWidth, //逻辑字符宽度; int nEscapemetion, //每个文字相对于页底的角度,单位为0.1度 int nWeight, //字体粗细度,范围为0~1000 BYTE bItalic, //是否斜体; BYTE bUnderline, //是否带下划线 BYTE cStrikeOut, //是否带删除线字体 BYTE nCharSet, //字体所属字符集; BYTE nOutputPrecision,// 输出精度; BYTE nClipPrecision, // 剪切精度; BYTE nQuality, //字体的输出质量; BYTE nPitchAndFamily, //字符间距和字符集; LPCTSTR lpszFacename //字体名; );
步骤1.选择向导MFC AppWizard(exe),创建一个 名为DrawLine2的项目.在MFC AppWizard对话框的 第一步中选择单文档.

第06课 - 图形设备接口

第06课 - 图形设备接口

消 息 队 列
线程
17
return 0; }
鼠标消息
Windows程序设计-基础教程
鼠标的消息有哪些?
WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP WM_RBUTTONDBLCLK WM_MBUTTONDOWN WM_MOUSEMOVE WM_MOUSEWHEEL WM_NCLBUTTONDOWN WM_NCLBUTTONUP
18
鼠标消息
Windows程序设计-基础教程
WM_LBUTTONDOWN 参数功能:
wParam 存放一个标志,该标志注明了当鼠标左键按 下的时候还有什么键同时被按下。 lParam 存放当前光标的在窗口中的位置。
19
鼠标消息
Windows程序设计-基础教程
光标的位置:
xPos = LOWORD(lParam); yPos = HIWORD(lParam);
34
Windows程序设计-基础教程
绘制直线
பைடு நூலகம்
35
画线函数
Windows程序设计-基础教程
BOOL MoveToEx( HDC hdc, int X, //起始xpos int Y, //起始ypos LPPOINT lpPoint //光标的旧位置 ); 功能:确定直线的起始坐标 BOOL LineTo( HDC hdc, int nXEnd, int nYEnd); 功能:确定直线的结束坐标,并画线
27
设备环境句柄
Windows程序设计-基础教程
HDC 设备环境句柄
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


绘图函数:Ellipse()…

文本输出:TextOut()SetTextColor()…

数据成员m_hdc:设备描述表句柄。
PPT文档演模板
图形设备接口及绘图
➢CPaintDC:
✓ construction CWnd::BeginPaint ✓ destruction CWnd::EndPaint
);
PPT文档演模板
图形设备接口及绘图
坐标系的转换
1. DPToLP() 2. LPToDP() 3. ClientToScreen() 4. ScreenToClient()
PPT文档演模板
图形设备接口及绘图
3.8 使用CDC类绘制图形
• 绘制点和线
–COLORREF SetPixel( POINT point, COLORREF crColor );
PPT文档演模板
hNewPen=(HPEN)SelectObject(hdc,hOldPen);
DeleteObject(hNewPen);
EndPaint(hWnd, &ps);
break;
图形设备接口及绘图
使用CGDIObject类
• 数据成员m_hObject • Attach函数 Detach函数 • 派生类: CPen、CBrush、CFont、
–CPoint MoveTo( POINT point ); –BOOL LineTo( POINT point );
PPT文档演模板
–BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
–BOOL AngleArc( int x, int y, int
•释放设备描述表句柄
•必须与GetDC函数成对调用
•函数原型:
•int ReleaseDC(HWND hWnd, // handle to window HDC hDC // handle to device context
);
PPT文档演模板
图形设备接口及绘图
3.5 CDC及其派生类
➢CDC: 封装了所有与设备描述表有关的 数据和操作。
图形设备接口及绘图
PPT文档演模板
2020/11/10
图形设备接口及绘图
实验作业
1. 习题2,3,4
PPT文档演模板
图形设备接口及绘图
•§3.1 响应WM_PAINT消息
1. WM_PAINT消息的产生 无效矩形
✓ 打开一个窗口 ✓ 改变窗口大小 ✓ 移动窗口 ✓ 切换窗口 ✓ 最小化、最大化窗口 ✓ 调用InvalidateRect函数 ✓ 调用UpdateWindow函数
➢CClientDC :
✓ construction CWnd::GetDC ✓ destruction CWnd::ReleaseDC
➢CWindowDC
✓GetWindowDC ✓ReleaseDC

PPT文档演模板
图形设备接口及绘图
3.6 GDI对象与CGDIObject类
• GDI对象与句柄 • 使用GDI对象 • 使用CGDIObject类
量中。 • 响应WM_PAINT消息绘图,必须调用该函数获
取设备描述表句柄。
PPT文档演模板
图形设备接口及绘图
•函数原型:
•HDC BeginPaint •(
• HWND hwnd, // handle to window
• LPPAINTSTRUCT lpPaint
• // pointer to structure for paint information);
) • SetWindowOrgEx(hdc,-cx/2,-cy/2,NULL);
PPT文档演模板
图形设备接口及绘图
•任意逻辑坐标系的设置
1.设置映射方式
MM_ANISOTROPIC , MM_ISOTROPIC ( 做 适 当 调 整 ) 2. 设置窗口限度
•SetWindowExt()
•BOOL SetWindowExtEx( • HDC hdc, // 设备描述表句柄 • int nXExtent, // 新设置的水平方向窗口限度 • int nYExtent, // 新设置的垂直方向窗口限度 • LPSIZE lpSize // 原始窗口限度 •);
–BOOL PolyBezier( const POINT* lpPoints, int nCount );
PPT文档演模板
图形设备接口及绘图
• 绘制封闭图形
–BOOL Ellipse( LPCRECT lpRect );
–BOOL Rectangle( LPCRECT lpRect )
–BOOL RoundRect( LPCRECT lpRect, POINT point );
PPT文档演模板
图形设备接口及绘图
•PAINTSTRUCT
• typedef struct tagPAINTSTRUCT {
• HDC hdc;
• BOOL fErase;
• RECT rcPaint;
• BOOL fRestore;
• BOOL fIncUpdate;
• BYTE rgbReserved[32];
PPT文档演模板
图形设备接口及绘图
• CPen类和画笔
PPT文档演模板
图形设备接口及绘图
PPT文档演模板
图形设备接口及绘图
(1)调用带参数的构造函数创建GDI画笔对象,例如: Cpen m_Pen (PS_SOLID,1,RGB(0,0,255));
CBitmap、CPallete和CRgn类
PPT文档演模板
图形设备接口及绘图
•§3.7设备坐标与逻辑坐标
逻辑坐标系 TextOut(hdc, x,y,szBuffer,nLength) 设备坐标系 屏幕坐标系 窗口坐标系 窗口工作区坐标系
视口(设备坐标)与窗口(逻辑坐标)
PPT文档演模板
图形设备接口及绘图
映像模式 定义了逻辑坐标与设备坐标的转换 CDC:: SetMapMode();
PPT文档演模板
图形设备接口及绘图
• 窗口原点和视口原点
–调整逻辑坐标的原点
• 窗口限度和视口限度
–调整逻辑坐标轴的方向和单位
• 逻辑坐标与设备坐标的转换公式
– xViewport=(xWindowxWinOrg)*(xViewExt/xWinExt)+xViewOrg;
PPT文档演模板
图形设备接口及绘图
• GDI对象与句柄
PPT文档演模板
图形设备接口及绘图
使用GDI对象基本规则
(1) 创建对象
(2) 用SelectObject函数把新创建的对象选入设备描述表,并保留原对 象 (3) 完成绘图函数的调用后,把旧对象选入设备描述表,置换出创建 的对象 (4) 删除创建的对象,由 DeleteObject函数完成
PPT文档演模板
图形设备接口及绘图
•3.3 使用设备描述表绘图
(1) 获取设备描述表句柄 (2) 设置设备描述表属性 (3) 调用绘图函数绘图 (4) 释放设备描述表
PPT文档演模板
图形设备接口及绘图
3.4 获取窗口设备描述表句柄
1. BeginPaint和EndPaint函数 (1) BeginPaint function • 准备在窗口绘图 • 获得代表窗口的设备描述表句柄 • 把有关绘图的信息放到PAINTSTRUCT 结构变
图形设备接口及绘图
• 画笔 • 画刷 • 字体 • 位图 • 裁剪区
GDI对象
PPT文档演模板
图形设备接口及绘图
case WM_PAINT: hdc = BeginPaint(hWnd, &ps); RECT rt; GetClientRect(hWnd, &rt); SetTextColor(hdc,RGB(255,0,0)); SetBkColor(hdc,RGB(0,0,255)); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break;
–BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
–BOOL Polygon( LPPOINT lpPoints, int nCount );
–BOOL PolyPolygon( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount );
PPT文档演模板
图形设备接口及绘图
设备描述表
• 一种专门用于代表图形输出设备(如屏幕、打 印机和绘图仪等)的数据结构 –画布 –绘图工具(设备描述表属性)
• 使用句柄(HDC)访问设备描述表 – 设置设备描述表属性 – 绘制图形和文本
PPT文档演模板
图形设备接口及绘图
•设备描述表属性
PPT文档演模板
); SetViewportOrgEx(hdc,cx/2,cy/2,NULL);
PPT文档演模板
图形设备接口及绘图
–SetWindowOrgEx
BOOL SetWindowOrgEx( HDC hdc, // 设备描述表句柄 int X, // 使用逻辑单位,窗口原点的X坐标值 int Y, // 使用逻辑单位,窗口原点的Y坐标值 LPPOINT lpPoint // 指向POINT结构变量,存放 原始的窗口原点坐标
•} PAINTSTRUCT
PPT文档演模板
图形设备接口及绘图
相关文档
最新文档