前言: & ] N% s" C! w4 t1 O& K" R
0 x" k: p/ ?6 I这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。 / @/ T* V! m1 Y1 d1 ?( u' q
8 d* s4 U8 R% B& e! J, i m' P2 ]2 Y
3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。 0 b1 L5 ]: P6 ~$ B- w+ f; Y
7 B g6 w/ H* t) `# X% D1 ~9 b8 [! g1 开发环境
! n& z4 I8 n% o3 g0 y1 U/ `
* s$ H4 L9 W# p/ P, m2 i本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。
- d; b/ e- X: C6 S& H8 U
; l. L2 N. F/ ^" f: ~" uDirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。 N) A$ T; M9 n$ E$ c# t7 g
7 G) ~! j7 d& @8 B$ R9 @2 使用COM组件 ]. W$ k6 W# `3 X" N
) X% |6 C" ?# l" p. b6 C* S
DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。
6 ?+ x* c9 z# I. d2 i. V5 |. Q5 a' v# q# S! r! M- S# n( L. x+ S% a
COM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。 t& L6 w7 D, ]7 G2 J
/ v0 M: B9 |: ^8 D; T }
在Direct3D编程中,我们要做的工作基本上可以归纳为: 9 i. y4 D. w& u' n6 J& Q
) X$ n* v8 U) S& K3 u
调用适当的函数获取接口指针; 5 k. Q3 H% N$ H7 Q1 Q0 W
3 p7 a1 g$ o! [" p" q e. g调用接口的方法(成员函数)来完成所需功能;
: S0 q j9 X1 J+ R' d* {( X9 T2 w7 e" B( H4 h; g/ _' C. F' g" ^
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 / s8 R4 c+ n* L% |% K& J6 l
# T+ f' r! p# O, r% v2 g: O0 z2 t; u5 Q8 }6 s. q, N4 S. F0 W
3 第一个程序-初始化Direct3D
* L# ?' Y; B$ V9 N8 s
! }1 S! c+ n* w9 m6 s8 W3.1 创建程序框架 ! f8 L# G. [7 A8 j- c% F$ r7 X
$ n' U. V" J. L% o2 J3.2 初始化Direct3D - q% j5 U7 B' J' H- f1 ^
; c$ l/ U& F# s, P `& r8 u
3.3 渲染
! C' q. D' s* Z% A7 _; r( u4 X) Z- v5 ]- J3 d$ L/ k z
3.4 释放接口
, v! [9 t i/ x% }! i: I8 }
$ }8 [4 M& k2 S, I4 画一个三角形 " G, w A" x0 v
J) x; B S* Q4.1 一些数学概念 7 |3 S5 |( o; W2 ~8 X- f6 x) q
7 S2 G O2 b9 F, i8 v! `7 |
4.2 画一个三角形
: @4 t4 H7 J; `9 N/ e9 n' D4 N0 l" c! b: N. F
5 画一个三棱锥-索引缓存和Z缓存
! {/ F. l' y9 }: J# E) I; m" W8 ]6 X0 i( N2 d q
5.1 什么是索引缓存
* ^) M6 k+ H* K) u' M$ N5 q
4 r% j, D7 T2 E' D0 }& [+ w. r5.2 创建索引缓存 7 ~; n. J6 S' b) T
8 n* B7 d ]! |7 ~! g! h4 f5.3 渲染索引缓存
. t4 h( I8 P$ ?) ^/ A. o- ?# \9 a& j* s$ p
5.4 打开Z缓存
3 B1 V7 d! n! _$ G9 \! F
8 ?* [+ f' g6 y# p- k) d6 D6 画一个圆锥-灯光和材质 + [# k/ X0 _0 K: ~; e
% E. m. m' J9 ]7 |8 W
6.1基本概念
/ W: d5 Z5 d: t# B g I
4 g8 ^6 X' E; q8 m8 u6.2 灯光 # G5 y# [" t" Z: s
3 `% x8 L1 f, c4 Y6 E6.3 材质 3 ^- U+ d w0 z; R0 d1 i0 N
0 Y* r. z4 f* Q4 S& f0 P6.4 画一个圆锥
2 \9 J/ Y- R n8 {1 U
/ s: H/ {4 M: O5 L6.5高洛德着色和平面着色
8 |5 g) K- ^; q# o4 z5 K# n* ?/ j/ s
7 为圆锥添加纹理
( X* M/ t3 Q" e6 @# N" B+ w& W1 ?& s A
7.1 基本概念
+ n$ O4 v, b: }; j6 D4 V9 O2 p
# J) |5 }' {' x2 f: M7.2 创建纹理
- A, } C' l% s% O
; N5 X! K; t7 ~( m" Q2 G+ |7.3 用纹理渲染
# ~2 c$ r, V. c( p" G. h/ ^7 T o; Z7 X G
8 Mesh模型
' K- U/ m$ m) @6 `4 M( |8 M. C* M0 K f
8.1 什么是Mesh模型 * {: l8 P0 ]/ H4 e
( _- O$ I9 c* r, {. K
8.2 绘制Mesh模型
, i- J9 Z# Y3 p/ i2 [) Q: ` Q- e/ l( i3 K
9 显示文本 ( H9 Q0 C1 { e. M- i& c/ [" H
; W4 P# q% w- N7 B- B2 Q
10 Direct3D中的2D / A k- d6 t3 M; A: _5 ^# V0 T
+ r. M! k2 S6 p
11 Direct3D的程序结构 4 B9 L: x. j4 M; d6 p( r* s
3 p8 l7 f4 z7 ^/ J+ z! G1 ~$ r) O) x& H+ y0 {! [' s5 k0 @: Q$ f& d
请注意: 8 ]2 }9 w1 C: v) N3 F- F
5 b0 X: g7 }; k# h2 V' Z因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |