前言: 5 R9 R/ J7 ^/ t/ S6 w* P2 ]8 v' f
& {# ]1 W0 P( O0 X9 s/ f
这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。 ) h* V, X1 o* K
6 y# r2 L/ q3 c# u) J' T, v
3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。
8 i7 i0 t( {! m5 i0 _, ^6 T( G' ^; x2 M
6 q; Q( Z8 l$ X* g- y" u$ I' U1 开发环境
+ W/ H/ `3 i1 p* n: P6 ?; r6 m, I3 |% X5 z8 ?+ R* f
本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。
: o' p4 `9 L! Q4 d' L; ?0 m$ X
$ x1 o$ Z) t3 n( w4 J u) LDirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。 _5 v% g" B* m' v: u8 N
; _0 P& X/ {8 D
2 使用COM组件
9 z$ N$ |- V6 d: u- J# W. X X3 ~
+ [& ~: L7 k; V5 X2 l8 [( |0 m% }DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。 * Z; S, r) \+ O' |& z9 T( a
$ z5 y6 c0 ?4 S+ Q& \& v' KCOM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。
) B9 \2 T. ^2 ]. Y+ w3 L
, x9 i( }& ?; g8 W) {4 K6 N在Direct3D编程中,我们要做的工作基本上可以归纳为: 0 E- Q) ?) n5 a; T" W5 s4 i: S
2 Y& k% ~2 ]/ a9 {: v调用适当的函数获取接口指针; 7 d* [% h6 n0 k* x( t
( x" ~; G$ s1 G' P8 j, J
调用接口的方法(成员函数)来完成所需功能;
: k1 I& w% Q M; i: w J1 g) y K, l0 L8 @ k' B8 J- ^
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。
1 g x0 H; a j; Q4 O6 f4 @1 ]6 L7 ~ h
! b5 V* S* }& R5 Z; q4 l# q5 \
3 第一个程序-初始化Direct3D
9 X9 b' _1 M6 n6 m0 H% ]$ \& S& l/ M0 `% q }
3.1 创建程序框架 . }1 _! u2 [) z) k, g, M$ C
2 b6 P/ R |- Y5 K% O3 H% o/ b3.2 初始化Direct3D
) ]: ^) G) q# E6 r, _/ A" C. O3 c% {0 b5 H6 k. W1 Q# Y
3.3 渲染
' F7 `+ y% b3 k8 z s- |0 ]
' J) B7 g0 x4 p3.4 释放接口
) [" ]% S+ M$ u- ^/ e" L" y3 t3 L# l) v! U P
4 画一个三角形
) w$ i5 K% Y- ?" e( {. l4 ~0 F/ U* ?$ n
4.1 一些数学概念
; ?3 n5 V$ W% R/ n' x* x, @ t8 v- L; G& b' W! n5 {! Y
4.2 画一个三角形
4 a* x9 J. O1 v6 k% U4 n' |: R$ a' P4 W' D8 G2 B
5 画一个三棱锥-索引缓存和Z缓存
- j! K2 v9 e9 T5 v' a3 I' m( J0 r7 Z7 v- P$ t
5.1 什么是索引缓存
% d( p% B( Z9 a/ ^, c. }
# U' ]( t$ n% L* o4 p1 i5.2 创建索引缓存
; P5 Z/ Q) u3 Q3 [/ \. E
+ _' n q! q7 y5.3 渲染索引缓存
' Q# {1 s! |, d- a" X1 N! ~8 y/ A( |7 |! |1 I3 Y4 D X
5.4 打开Z缓存 / d2 f, O/ h% h0 ^4 Y! A3 w; ^
5 V7 [8 _, }( P& Y6 画一个圆锥-灯光和材质 N9 m8 t7 W& ^7 h w7 A$ Q- ~
7 s3 ]1 r- h1 ~' b3 b3 p6.1基本概念
9 w/ }2 m) q* R$ Y" R
5 o# e3 i$ w) j+ T4 O$ d) T6.2 灯光 : }5 Z# F# q6 P* J/ C( m9 }
& g$ p) w+ D, F3 H! h' E6.3 材质
" `% f: d+ N* H8 K5 h1 E3 J$ `0 E" _. w
6.4 画一个圆锥 & j- P3 c; V+ m3 G. m8 w. b
3 Y# k p" v3 G6 l
6.5高洛德着色和平面着色
0 v7 O* K5 u1 B4 T" j, L' M
% b+ Y: P& I h# L# [! K7 为圆锥添加纹理 + t q# y* v3 U R0 r
: ~6 s- c+ @! ?/ |6 z$ j
7.1 基本概念 " @ x8 V) u9 d
; r9 @$ W) u; @, w, C6 G- @
7.2 创建纹理 6 z8 l( x* z. `% o& m. V# a3 j
z9 X" X. d% @
7.3 用纹理渲染 2 y* U0 Z. C) w' f8 w: g' L
; Q5 ~, w; V# O# c+ C8 Mesh模型
& r U$ S* P" y: v& k
+ Y# J5 ^; Y1 z' e s) r9 ?8.1 什么是Mesh模型
! v3 X5 r$ K. L* P2 z8 c C1 v) Y# m5 z o; T6 E% k* Y
8.2 绘制Mesh模型
4 v; c/ y+ K- T7 R/ z3 P* t7 f- }- T( ^
9 显示文本
* |4 |! Z0 M( V) L+ |9 ^5 t( e# |; A( D# U
10 Direct3D中的2D 0 f; w. ~7 k" l, I3 E/ ~
( i X, z, v3 d/ P7 l- _: o% L2 M11 Direct3D的程序结构 + \4 t/ }1 ` o, W4 F4 `$ W7 F
' A" a6 X3 I5 H+ i% f6 t7 ^
+ Y$ a7 Q3 E4 d3 Q请注意: 9 E2 u/ I% T9 F* L6 d
$ N! ^+ a1 P, a7 \2 i# e
因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |