前言:
- D% q4 T% _% m. d" G& k/ Y1 l! X8 V5 Q
这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。
# w9 W {' ~/ u5 f! A/ z' {: f6 P1 p( x: x. H
3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。 . p( k9 t g1 K% O- ^& J' X5 C8 H
% K: L8 w- G* y3 E
1 开发环境
. V" X7 p; P2 x L! U7 z) |1 A, i9 N6 h `2 {& U+ a; Q6 H
本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。
2 y1 L) s2 [! R6 H& N) G: f
6 J7 s3 j% T* A8 IDirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。 9 N* I# T/ ]1 |; u) k! ]/ h6 K
+ L3 B" W' D! [& E( \: ], l
2 使用COM组件
6 \) V' R+ ]( U6 i6 e% X3 z+ X" Q0 Q, A6 d0 d% M. k8 _6 H
DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。
+ H8 P3 j! J0 o9 B) j. h" u* M* q3 }* q+ r/ X& N. a
COM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。
( G! d6 D* W" N. x, U) B ?5 q# \7 r6 O( U4 o* g) |
在Direct3D编程中,我们要做的工作基本上可以归纳为: 5 T/ P1 a$ x- q F( C. O6 t
7 G7 P6 V0 T+ |9 q( N) `
调用适当的函数获取接口指针; ( e/ n) Y) Q* P5 ]$ m3 c0 E
6 P* P1 g' l0 q( P2 J) B调用接口的方法(成员函数)来完成所需功能; , o8 m; l/ B' ~& v5 f; X
! ^3 G( ?7 w* c G" `1 D, h
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 " ^$ V& q6 W* h7 M4 E( e
: X" C( b& L6 R; M# U
/ i1 f4 y* [( V5 N p4 }0 {3 第一个程序-初始化Direct3D % q" @. S9 H$ @% D
, p, v0 k. L* t# Z7 R% M3.1 创建程序框架
7 ~* g: k, f- f/ ^. A9 a
0 I9 A$ {/ ~/ l7 ^6 k3.2 初始化Direct3D
( e9 C/ V/ A) ~4 |# r* t, x8 I5 E7 P& S5 a
3.3 渲染 - L$ V4 |4 u+ q# l1 l* G
K- @# o) o4 r+ b3.4 释放接口 5 D0 t0 n9 o6 [% h- b2 p
& E+ Z% z6 b+ ]1 R% W4 画一个三角形
; r; x0 k8 g( H! ^5 v
( h% K1 r8 M/ z! {5 f+ u0 o4.1 一些数学概念 / c3 q$ k7 M1 q
4 M# |% G Y" a7 r; R) D; H
4.2 画一个三角形
/ h% d& E3 a8 v: z* O
' S# m8 F9 x; L6 X' }3 o5 画一个三棱锥-索引缓存和Z缓存 ' P% e6 i! W6 C/ e8 R2 ?0 f
' ~: c/ c7 b! P- v5 `; p J. U7 \4 x
5.1 什么是索引缓存
( p9 u' f4 l6 F: h* }' g$ ^4 ^" r+ j- m
5.2 创建索引缓存
U+ }: K5 b8 f2 e0 F" r$ R/ z. u/ b' V7 e/ ~+ S
5.3 渲染索引缓存
/ [4 _0 i, a) }2 ~, v6 k1 ?- A4 o6 w1 ^) e& c* y
5.4 打开Z缓存
) P+ ]' B; F- w; ~9 H$ E8 y# R
1 M2 \; X- V5 T6 画一个圆锥-灯光和材质 ' o6 @2 z3 J0 G/ `; Y1 O1 H
- q2 O @) @# C& ~* t6.1基本概念
' Q7 @- e% U. k: M3 s |' m# R
' k: p' ^8 b6 p# y! T6.2 灯光 , f0 @, c" ^1 c- v& F: J6 G) I
9 Z# F3 U' E/ |8 S6.3 材质 E4 ?' Y# n7 J! |1 ^) `4 M$ i8 o
N9 c6 Q0 n0 z5 i# P3 V7 j0 }9 N6.4 画一个圆锥 * k; U W/ N. v" L
7 j& `2 d# A- ^, |' O6 G
6.5高洛德着色和平面着色 2 q0 [2 y1 [1 U2 n
8 e5 K2 e' t$ o' O6 B9 X7 ?! t7 为圆锥添加纹理
M# U0 v5 a& l, D
% c/ @5 z( N+ ^6 z* {2 M/ O7.1 基本概念 ; Y* y" B+ {0 @8 @# R
+ M8 N5 m* O# o5 ~) b( ~( B1 ] B7.2 创建纹理
4 l- Y+ @: d' K( Y; d: A, J+ _+ b( ]8 o: p5 F5 X
7.3 用纹理渲染 % I- D) F; Y# e0 h, l$ S
1 \( q9 U0 {* }2 W' J" C
8 Mesh模型 1 G! C" R7 `$ f" K. x3 A3 ]
0 C6 q9 ~* `! k
8.1 什么是Mesh模型
/ @; H0 g6 ?7 a/ v: R$ P
5 {+ K+ \7 Z1 Q( {1 N- b0 _5 x" N) F8.2 绘制Mesh模型
- u$ _! ~; E9 l. F4 F; b: j( D! A( S& K/ z! g5 `: T8 G' l
9 显示文本
; g) b" T) ], e+ |' U8 f
4 R1 D8 }* i* l+ m+ J10 Direct3D中的2D
6 t; s; _: [& ?0 J$ f, D, h
, o6 h3 {- A$ e11 Direct3D的程序结构
: t7 w$ O, L; k6 ^4 i) h3 ^
0 e. g# o! D1 V& c. x! y, v% Y( d+ O7 v7 M1 s
请注意: 1 s3 G& j" [/ B% K
* S; \1 Z0 J; ^# }
因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |