前言:
% C0 w c8 f+ Z/ L" D' f
: ?, ^- P1 I( r这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。
- e: Z5 k8 m8 a7 k! q+ W; v
) ^/ ~; Y! Z) w# ?4 W. _( ^1 p: [3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。
* N w5 F! [( f. v2 Y
7 o9 R4 j, m4 W) h( B. G/ L2 o/ c1 开发环境 5 W: F b6 d% D# E" B! U' {& g5 O
) a: y5 W* b2 w9 |" I3 X* v) ~本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。
% n4 q/ l! w; ~6 l* B
7 O+ [: t! b2 f' h* V9 \* [, IDirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。
9 X7 z3 p+ ]* A5 m9 h( F
5 o# c& m" |1 l2 使用COM组件
7 m6 |7 C4 ?+ F
+ {/ j- i# E' n3 x6 kDirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。
, R2 H, J0 J, C3 J& i
6 q$ D- R2 K5 s6 ^3 ACOM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。 3 D- T' ~. S5 m& P/ h' d9 F
- @ S, f' Z! i) X在Direct3D编程中,我们要做的工作基本上可以归纳为: ! K: e# ]. v. [( b0 A& V; g
: ^! n8 J% A1 Z* B3 k. d
调用适当的函数获取接口指针;
1 D+ L6 `, O- e& i5 Q5 R- n
. A1 M) E" n/ d, i0 a* M- s0 |& [调用接口的方法(成员函数)来完成所需功能; $ h' N0 K1 }- Y3 V( ^" ?
9 F, H8 b" c8 r# d# u
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 3 m t) y" \0 Q1 \6 o1 l* X# B
/ F, x* Q2 ^ c# u7 K
% \% d3 I* w2 k3 第一个程序-初始化Direct3D ) i+ |0 [6 \: V/ d( Z
. O4 T/ @+ x8 O" x3.1 创建程序框架
% ]7 Z* T% S" K6 L0 {
; s$ M% N1 x2 t V/ U- e3 }4 y3.2 初始化Direct3D
8 K: E# z8 b; {
& L; o+ K9 a; y4 ]3.3 渲染 6 L4 D. @% {: b S
7 x/ k, M) k5 |& |6 Z3.4 释放接口 9 j6 q" E' t' h5 X6 Q
5 g& P0 y; N4 D4 画一个三角形 2 w. C1 {" I3 h S
8 B7 f6 c- _( P- e* L
4.1 一些数学概念
2 \, [! R3 P! c6 a5 Y& o# B
& C9 w8 _9 i) v- S' f$ }: c) N4.2 画一个三角形
6 L6 ]3 z. W! w3 e* e* t7 ?6 K( l: P/ }
5 画一个三棱锥-索引缓存和Z缓存 , c% e) K+ b! j1 M i9 g. P
7 ~+ g9 v( a- T6 l1 F
5.1 什么是索引缓存
7 _' C" K/ o* t$ B: z% B" p4 x2 E& P
6 C0 H, S% t/ K \7 r2 r5.2 创建索引缓存
* k9 S$ k8 ]% _
! r1 h8 @- s# }: E5 W) I4 W, J5.3 渲染索引缓存 5 }# J7 Z" g7 s: n
" X6 e# N/ l+ I/ V& s: i B5.4 打开Z缓存 ' X& ~7 Q6 Y% E' j. z! P6 J
3 O, f/ v% W+ p/ l$ }) H7 l( p
6 画一个圆锥-灯光和材质
- x9 C* T' b0 n" v% t! O4 L7 H/ ]7 z; p1 w0 v
6.1基本概念
. r* A4 k: Y8 \' a0 w, z% R1 a8 Z
( r/ x$ z0 t* f6.2 灯光
, [, S* C1 Q: D# y9 L, A2 T! _4 f+ A5 E: j5 u. n
6.3 材质 5 l( c6 ]( M6 W7 H3 S) G
: y, }* Z4 Y8 W G6.4 画一个圆锥
) a/ p0 b; @- c+ P K' B7 ^2 n( e3 W6 Y* D
6.5高洛德着色和平面着色
, \7 u6 u) H+ u% f1 O( z* \( n' ^/ O& [
7 为圆锥添加纹理
" J8 D* @1 D! z( K; D
5 p3 s! |4 ~' C$ e# T' M& @% m7.1 基本概念 9 i( g3 D8 d6 x( B! ]
5 V6 H g" H- o! b' S) S9 N; U
7.2 创建纹理 ) a. u4 V1 o+ p+ L8 x/ c
# `2 q6 a8 i5 h* k% P& t3 G7.3 用纹理渲染
5 h7 @* a5 f; n: }- ]6 ]# B2 K
8 Mesh模型 : i- n( Z/ @4 d! M0 o. P# t
/ C3 `1 M* l6 \. d: m% p! t# }8.1 什么是Mesh模型 " R8 S5 x: `6 l' c+ r3 H1 c
( p: y9 x7 a$ b: X! x, X/ ~
8.2 绘制Mesh模型 + V8 N2 P/ {) f' \. e
6 W) u2 u5 Z: [
9 显示文本
7 B3 ]9 [! K% q; u# n; m1 b) J2 Y o2 c/ ~7 }/ j9 B- z( o
10 Direct3D中的2D
4 P ]5 Q' x" J% D2 V _$ E H" N7 p" s
11 Direct3D的程序结构
# m( g$ c' \& ~6 v$ s6 R* t5 {) g5 L x. }8 x2 [1 F
- F; B& `, o1 w
请注意:
- z% ^/ @0 J) z4 x3 J/ S/ ~0 n+ K7 _1 F% Y `; R
因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |