前言:
( C6 a6 K& T' U: c0 k" u/ ]4 o9 B2 r, }- V$ \' o
这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。
: P; w; u$ y- H, M+ V$ E" y% ?/ y: S! [/ y. y
3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。 4 _8 s: g& O2 O- r( H/ h! a r
* T0 N" ?* _* j2 n$ h! M
1 开发环境
- c- _- ~( P" X! y, a1 A7 w6 F7 B* I6 i1 j, K- l8 {
本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。 ; A4 l P1 h9 H7 U. [4 Q5 h% K
# c4 {. Z2 [! r0 w& s' l
DirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。 4 ^1 @7 |7 ~1 k8 ~6 Q( G6 W
- `0 e" E) {0 ?; ] S, X$ S2 使用COM组件
' }7 t9 H, N- k- @8 `6 v# k) ~1 I& M. r
DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。 # Y( x7 L; h3 P/ w' k, a; M
1 x6 r* G8 K3 n2 wCOM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。
, y; e. [3 [* P0 i- A% D( i' ~7 ^1 G; J' B# z' U
在Direct3D编程中,我们要做的工作基本上可以归纳为: 4 f: @! N8 @ C8 ?# r
) W+ D+ h/ M4 c$ w; j1 a1 p: V
调用适当的函数获取接口指针; x6 c7 r. g" r+ V; `6 H
0 X& J9 Q9 w2 h# b$ Q( b- g7 F
调用接口的方法(成员函数)来完成所需功能;
* k3 Y7 ^4 Y) r& D0 e2 u% j* t8 Y" {& O
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 9 S4 g0 N F* t! i
6 U8 L' B# E& _5 D7 v
; b1 J, d" B8 q# ~" j3 第一个程序-初始化Direct3D 9 X) R3 n {0 N6 v9 K8 p
5 `8 j2 V& g5 C0 e9 D
3.1 创建程序框架
7 w/ }. i: A# x, ^" [
2 `+ p9 P" v+ g9 |3 U3.2 初始化Direct3D
: r: A) r! e5 i1 d& I- X, ?( N- i7 R8 @/ H0 g
3.3 渲染 & ~' Y T" o* T/ q; S' C- F
" G% g" H) Z# o3.4 释放接口 * {* M; F. V' s) B. u" I
' h0 Q1 T6 }, @/ y, e, N
4 画一个三角形 : H5 L; w. {. l7 W, |: V+ S
" X. |( c6 w7 N$ a! i- m
4.1 一些数学概念 9 H0 t) }7 u0 g" n. @5 V+ H
7 s2 L0 u* {3 _+ k: }
4.2 画一个三角形 0 c# k$ K6 p, F6 v, ]: P8 g7 y
" y9 Y0 D5 y1 t) H1 K7 B! n1 g5 画一个三棱锥-索引缓存和Z缓存 2 S# W8 h% M0 `5 @1 q
% I7 Y! |+ H/ H7 |) }6 m! E, r5.1 什么是索引缓存 : _& t, m8 c' M n
" t9 z( |* g% k6 C' s
5.2 创建索引缓存 - e$ O$ p$ n6 u
4 I/ S$ Q6 W1 J4 k7 n9 a$ x5.3 渲染索引缓存 0 N# L, n' ~" `
1 F/ T5 c9 |( Z, ]1 i. n& J5.4 打开Z缓存 % ?4 S% Y7 ~ \1 d: ^2 ^: r. A
7 D4 V: y- e4 w, Y3 H& a- l ]
6 画一个圆锥-灯光和材质
2 m% H3 G/ u( o$ K& C% q& q4 b
6 V. M/ E/ D9 r B0 z8 h% m6.1基本概念
# F$ o# S9 M+ B
3 g0 S- r2 Z) m4 l6.2 灯光
& a! z. q, n" A5 r* J) |6 h9 \9 i X7 y( H' g" j
6.3 材质
. k" `/ m) O& i/ W" h1 f2 k$ ^! d; S; w, y: y' A7 t
6.4 画一个圆锥 0 z0 m( f1 J6 X" `- ]9 |: W8 i9 n9 c7 l, P
! F6 G: u; t! S; g( a6.5高洛德着色和平面着色
8 e. }6 L4 K* i8 ] a, y3 I, ~4 c& F" {( ~9 F1 p* `: X( C
7 为圆锥添加纹理 . P* W- Y8 |2 K# G5 @/ [8 g
& x2 ?/ i' V0 l. ]: ^& J7.1 基本概念
$ c# G+ t, N, i/ A+ n& ]( y( T6 ]
7.2 创建纹理 * l8 H/ Z# Q* U% Y+ d# x- q
& v. s) `& `, L# J$ `
7.3 用纹理渲染
9 I% {! `- |8 Q. m- o' F' F) ]6 V. t' E* ~( ^8 h
8 Mesh模型 ) o5 x" V ?2 b8 t) T+ }1 l" d& P
5 K" ]# D5 u3 N" H7 E8.1 什么是Mesh模型
$ Z. h5 _/ r% r" d) R
8 W0 w4 P0 {9 @; |3 ~. E3 ?$ ?8.2 绘制Mesh模型 X8 z. j& s7 P6 ~5 i
; k" l" U4 }0 q( v+ z* ]9 显示文本 0 |* n1 \ Z2 e; B3 `, [
+ K- H, U! ^) X3 d o10 Direct3D中的2D
/ y+ ~' `; E/ y6 j6 {: P7 \3 y
3 [2 w$ ?/ T, G9 u4 p& N3 }8 Z8 W11 Direct3D的程序结构 - o+ f9 W, }; m- y' l* ^8 f
% R5 \# ?3 w$ {# c" ^6 g: l# H2 P r0 D5 B# u
请注意: / i* k- m! M7 P- M: V6 D. z
2 ^+ c/ m; j( H, e$ i2 D3 ?4 b因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |