前言: 6 j, T/ |+ I* U; r5 I
1 e" J/ A) o1 L: R/ ` f' i( E5 ~! [这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。
( c) y7 D& J0 C5 G8 [! k* j/ ~, l3 T$ @/ [. J
3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。 # f3 P8 U8 [8 V
+ \% O4 _- ?' l7 v7 M0 }7 t m* Y
1 开发环境 ( \9 _# Y9 t) K: m/ V
& ]7 g8 A* j0 z本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。
+ w4 M' a2 W- n1 Q+ S' o1 g" f) H
/ R) b( N6 A+ T p- [, e( ^" l7 Y* SDirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。 * h, D ^6 u. O' }) Q& j: r/ O# H
4 G) w. e+ [. H0 Y: p/ u, |
2 使用COM组件
2 N6 f* M n6 R# d H5 f8 C; T' {1 a# u) y! b( ~! p
DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。 6 S8 Y: j; t2 ` @, ?3 j. T2 n( E
* M) I, q) w" h! @# V
COM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。
; h( F( `9 F0 U8 `
) ?- e3 }5 q$ K8 m在Direct3D编程中,我们要做的工作基本上可以归纳为:
4 r1 @) x* a8 _( [% d4 H
; Y; C }' a0 f4 U调用适当的函数获取接口指针;
2 Y# m2 K. w2 @ a4 z. N) }" R8 e1 W8 {
调用接口的方法(成员函数)来完成所需功能;
& S( X: s C5 [: @0 g' u. P9 }0 }0 \% g' c
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 ( g& v2 m' b+ K" o. n1 I
- n. K8 {) P8 t- ?: v* [4 b* c/ G" v
3 第一个程序-初始化Direct3D . F: ^- y1 v% u
& N9 c* K4 o/ S7 Y; x* i, w8 R
3.1 创建程序框架 , f3 v# K3 m+ ~
/ u4 {' z5 C: d. ~! q
3.2 初始化Direct3D
4 x$ |0 N+ W/ ^- r9 \6 n% l7 A l
3.3 渲染 7 G3 b+ X: P+ h+ z- I! J2 }6 ~& g% E' h
1 m, G) u% ` V; R! R+ L9 p* t: V
3.4 释放接口
; ~. ~" Z& F b+ N- m
8 }/ O7 r7 k( g6 Z; ]- x4 画一个三角形
, Q& K! M/ s* l* h8 k6 u5 V$ X L2 x p
4.1 一些数学概念
; H! f$ l: U" Q. U3 r# b+ e" w9 X, L5 @5 J/ U
4.2 画一个三角形 9 f( K {2 j+ c9 P
9 u3 T+ V: K# {" c5 l5 画一个三棱锥-索引缓存和Z缓存 7 t5 `* L0 J5 Z
* `' V% O- L* r( c5.1 什么是索引缓存
4 i0 Z0 j, l3 C: N6 v% p5 x" V8 h/ m$ @' U! Z
5.2 创建索引缓存 - u; _7 }5 G& j* y& m
0 e4 t2 U% Q: w0 {
5.3 渲染索引缓存 ' b- V' Y4 x f1 D! Q9 E
' m6 O9 K* O1 M9 r5.4 打开Z缓存 & x0 B% [' R$ k2 J# _6 {5 b3 c
5 d; w; i( Y9 ` y l# E \! @6 画一个圆锥-灯光和材质
6 N1 h" t) `' H6 h: l8 N$ Y: L9 g- T4 ^" _# |
6.1基本概念
) B: T t6 K. Y7 b. Q4 T' Z1 d" j
6.2 灯光
( [: ^# r) s! E* z: D$ @
* p- f0 w' D6 O/ K/ R$ H6.3 材质 6 S% C4 a7 }0 y2 V. X( w3 p
7 u2 `: l/ _& @. e; U0 a& s
6.4 画一个圆锥 , Q, B: Q$ w# d _6 W4 I- Y8 V
1 O3 e9 D2 R; H( Q
6.5高洛德着色和平面着色 - r% j$ E0 W' M, M
?+ ?6 ]3 I! h* a# E7 为圆锥添加纹理
0 `) d$ m, y* W9 v0 V/ C/ B8 y. j% `. k7 @9 `4 e
7.1 基本概念
2 e$ s& E6 d R8 H: ^9 o' h* K% v& @' K5 i
7.2 创建纹理
% [& [5 Y- E# h& n, ?
2 N$ \0 T4 B- v" F5 \7.3 用纹理渲染 $ K/ J) Z+ U1 E% w
0 g9 E8 w' X8 a/ z* }
8 Mesh模型 5 x0 C9 Q4 X, a6 w& Y; V
! } @+ M" G0 \% M; _1 Q$ |8.1 什么是Mesh模型 ; }8 b7 Y7 I9 _$ F
. {% g }( u* O7 x8.2 绘制Mesh模型
' f: t- q' U& [# S" W1 z
8 i# m/ M5 N$ W+ I1 T( _9 显示文本
, H8 R$ [6 Q2 s/ i. _2 Q3 V9 l) h |1 w# }( T d
10 Direct3D中的2D
' B- ]- y7 B: [) | ~ W3 g; f" Q& m- F& I- K) e$ j. j
11 Direct3D的程序结构
' T: Q' k+ v) [- n0 ?1 P; N& c% J( T5 @7 F: N
# ^- T" S8 q3 P8 z
请注意: ' X" B1 C, W' B* ^" I5 j! w
" q; O) o4 i0 ~9 u* s
因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |