前言: 0 f7 @: q! f- L. |1 p
& a5 W5 q0 x0 f* n% U
这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。
( l( ]' L2 e2 n5 Q7 @. j# n" k7 L6 | M2 z' R
3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。
1 L, ^6 X" Q. v' @, W, {, u8 J$ ] a/ J% ^- `+ r9 _5 U) C" {
1 开发环境 ( q8 J% K( Q3 B
9 C$ \) E$ L6 h& J0 i) |0 w本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。 3 N/ @$ V4 |6 @5 D
0 W! h! O+ t- x6 [# p1 BDirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。
( k8 G2 ~2 [* q! Q5 {& w' j2 q& j+ \) F- K! t* C
2 使用COM组件 : q0 |5 K3 I+ Y" ` n7 b
- c% z9 e& W2 W4 D5 o( `7 WDirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。 : Z+ c6 D4 Q. G5 w' W, D! o
4 _: M) O& _$ n4 ]0 {, h: D8 s
COM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。
/ W9 v: m2 `$ k9 z% @1 g9 ?" T5 D& O" W" c
在Direct3D编程中,我们要做的工作基本上可以归纳为:
9 m, p. }% M- b( `
1 Z0 I+ f g! }7 Z1 e调用适当的函数获取接口指针;
9 Z6 [3 g0 [2 X9 K- u" v; h9 H* d- W( {. d
调用接口的方法(成员函数)来完成所需功能; 4 I) H/ h d/ m: n: S* |
2 R' N- V) H1 ~: G$ B+ [. w用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 + e! G& ?9 U5 U* D- [2 p- N% Y
! R5 u/ d* I. j0 {* S2 r) I
! y _+ |+ Q) u* |1 _6 S
3 第一个程序-初始化Direct3D
% J. z3 E7 E. w5 |" l, B3 Y7 Y% z8 X9 [: `2 i g
3.1 创建程序框架 # X4 U* ?: E2 n+ @
# O, s, z7 I" @* f$ e# t; X3 o3.2 初始化Direct3D ) Z/ J& T, {1 w7 k: |, Y9 c: p
8 U$ G) o o0 l0 W) |3.3 渲染 1 B6 N" O4 e' V& |
9 P6 ~' s. t+ Q8 ?/ e( O- f
3.4 释放接口 2 d% }7 D& e) U; I2 v; l
@, @" Y7 i0 X
4 画一个三角形 0 |! k1 ~. t9 ~ q/ D
2 C) H) ~3 T4 @' T4 \9 }4.1 一些数学概念
7 ~- U8 l7 k9 f' A, p# w9 Z+ s; E# {- C" g3 B- h% g1 f
4.2 画一个三角形 9 v* o& b# P) Q6 k; I( y+ O% h4 E
; G6 S9 I' N9 J) Q
5 画一个三棱锥-索引缓存和Z缓存
+ m, M2 n/ r9 A( s
5 l9 `/ w* x$ [' I$ w; q' V. I+ O4 }5.1 什么是索引缓存 1 \" ]) @- x: A t
; z4 T3 w7 K* ?5.2 创建索引缓存 * v, g# h+ G' @) A! O; [
! ` g0 t2 ]7 l" f6 o! p
5.3 渲染索引缓存
3 j+ h% _+ p+ Z7 ?8 {8 W5 q
' N% n5 h+ Y0 I9 |5.4 打开Z缓存 : B- ~, [* \; N5 ^, i3 F
& x. ]& L- ~6 s/ E3 U0 z. C( f6 画一个圆锥-灯光和材质
G* d( {- y$ N" O1 r2 w0 @# B; g- B1 z6 F/ @1 D
6.1基本概念 " a2 \: I) u8 B: @& g% _3 o7 p
6 f2 i; M8 T+ o& Q9 H2 G
6.2 灯光
" J6 {1 S6 I0 l
" ]: N2 o9 i5 e7 w5 o2 ?8 [6.3 材质
& q1 H6 r. W$ S( l! h# ]
$ a# d0 L- K, Z2 v6.4 画一个圆锥 % C% }# V& q2 t8 t
8 f7 q5 ]* v r. R; F# E6.5高洛德着色和平面着色
], |% _1 F, G! l' m* D8 M
" K( o" g, d! V3 P% T! \7 为圆锥添加纹理 ; o- E* u' F; J" t" f
" J2 M8 }( D% f) z$ H$ y, _- E7.1 基本概念 * [3 G+ d( v# T( V
4 i/ D3 H G! Z9 h7.2 创建纹理
7 ]5 B6 O/ n0 j, O: Z! j
2 o" x/ n1 `4 b; q; `: @. g7.3 用纹理渲染 $ j5 t6 `1 R1 ~( a6 p0 g# f( q7 ~
4 ?5 L' }. \' `' C8 Mesh模型
! R5 p" `; S1 U& T: L! W' u% r% ~4 n
8.1 什么是Mesh模型
+ f2 V' d9 p1 x4 E. ?) x3 Y
- x9 Y8 E# q! h' j8 I, _8.2 绘制Mesh模型
: N' C0 c9 H2 F/ W- k5 s" I, t' Y/ l% M; G* F) k S0 _, n
9 显示文本 5 w8 `2 C Q$ C) ~
! v9 M% m( w+ o w8 j2 j
10 Direct3D中的2D % n" v6 m- d8 P9 H2 r* ^# r8 M' F( X
# ~. Y; I* g, A1 o: O1 [11 Direct3D的程序结构 3 ?" h- _/ k3 ]5 V( ?
: n3 F, I, {! ?2 ~
5 {0 P* B! Z9 [6 z3 R$ a) F
请注意:
! ~0 x1 w+ a( l/ N2 p1 B2 ?
" ~& ?& m+ N' f0 y因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |