前言: * Y1 Z9 [: s2 J( |+ p% N- i
3 J) ~9 I1 l }8 G' n( D+ N
这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。 5 m3 {5 n: L+ U2 h7 x0 \8 t/ {) c2 X
4 O c; }2 y8 g' D3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。 & ?6 h4 D0 g. u' `
9 ^5 s. N; n$ d; J {* ]$ W5 A' e1 开发环境 ! o3 m9 O- e0 S2 Y: f0 E
9 g' C9 a' z8 q! F8 ?8 ?
本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。 : H" ^/ o. ^4 Y4 p
P# b2 E- Z& N% T5 |* q$ oDirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。 / X$ F" n- U8 i) }, Q, |- L7 x
4 Z2 T- e D& |# a* I0 E1 f& v
2 使用COM组件 2 k# D# _2 ]: y+ Q
: r: H) r" t @DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。 ) h. K5 J1 t; `! I* k8 ]
) W8 g* |8 N' WCOM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。 " {+ i! S- G1 E
* n( t' s$ R* G
在Direct3D编程中,我们要做的工作基本上可以归纳为: : Z2 \$ L" ~ p: ~ b
7 ]/ H. {/ v4 Q调用适当的函数获取接口指针;
0 I' g, t O. N7 E9 l3 s
7 A4 _, H' [. R: L" q3 j调用接口的方法(成员函数)来完成所需功能;
7 y* p1 x# D8 r% a2 J9 J* C( E2 i ]& y* |$ }1 o
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 . q* _2 z% N+ V$ G' L% ?
K8 p; \, B6 |% l, ?
* L! Z( g. Z7 I* o3 第一个程序-初始化Direct3D
- s: R% A' v2 v" I+ f# W ^
2 }. A0 o. F! _ c4 C4 C; z; k) l: [3.1 创建程序框架
3 s8 q: K) W: b1 Z7 f: E9 x
, Q+ j2 x( |, Y# P' z: s# Q$ f3.2 初始化Direct3D
, H) o* h8 a8 B% z; N3 I. q6 |; V* Z* v/ o0 h; Z+ u
3.3 渲染 / s/ z4 G$ U& g" y+ M7 R
$ n* U `8 @' A
3.4 释放接口 / z1 | t, x4 p2 ]1 F
$ O6 Z7 N4 T: P( _- O: N4 画一个三角形
- j! O9 V2 H% n# F- L- C; u. Z6 D; Q& @" @3 K
4.1 一些数学概念
; P; z5 A5 q+ s# M. p/ C( c6 }% W. g- O4 R" I
4.2 画一个三角形
5 x; ^8 A8 N8 g! L. y
0 q/ d0 I h, T5 j8 I' ?* _$ d5 画一个三棱锥-索引缓存和Z缓存 8 T: n) e/ u& H, F4 h+ Z
v% Q1 y- m6 F/ x' F9 o- C
5.1 什么是索引缓存 / M' S# n4 U, A& Z O% Y
& ~* O) z$ |5 J" v( g0 F5.2 创建索引缓存 7 g3 w+ |% z$ F {% S5 P/ T6 E
7 _, V. Z' t- }4 q8 @! ^( q' Q5.3 渲染索引缓存 d! o) n$ g# p
. w- t% ~9 j5 x. ~6 n2 l) G s7 s5.4 打开Z缓存 ( o: u- ]8 n$ O) X5 v5 E H6 U& Q
. f& O) D( Z1 K) L
6 画一个圆锥-灯光和材质
8 `( X8 K5 }& h8 z
4 c- G7 f+ V! Z! w! t% z+ _6.1基本概念
: V' ]1 [7 I3 m, ^! P# ?8 L
6 _6 K( _2 m9 u3 e% G0 h9 H, n6.2 灯光
* N6 C; N! C. {/ O7 c1 ~1 @. u6 d) `' L; B+ H* R+ I2 y1 g8 P6 {
6.3 材质
! p8 Q& ]. `( _: p3 p# z
8 N- |) V/ T; Z; }# Y& H6.4 画一个圆锥
; e- w0 d" [4 c7 ~( O: o; l ?/ a6 M: S
6.5高洛德着色和平面着色 : B3 s4 h! j4 {# M
$ X5 u' G3 K5 Z# _
7 为圆锥添加纹理
1 f$ j9 s- x* O! `6 z! _4 j& |; Z9 G" ?6 [6 a0 ]
7.1 基本概念 / T Q2 [" }9 a6 t3 B0 H2 v F
# E, S# U5 W" [. y/ u# m d7.2 创建纹理
: h# R' M7 k9 g% @
) z, S0 Q8 M9 A$ }0 u7.3 用纹理渲染 * {' J+ m* K7 M' N/ R
7 Y$ _, U+ u, L r" E0 O" ]* ~5 q8 Mesh模型
$ E, i% X5 f& d" b
% P* X2 L9 m/ W1 b, U3 Y1 Y8.1 什么是Mesh模型
9 w1 a' p, |1 K9 _: f/ i3 h
4 [8 j3 ?( R$ ?8.2 绘制Mesh模型
; x( M( c( B# v. Q. c" p `2 p5 ?" I3 C4 |+ @9 t8 ?
9 显示文本 % H' X% R9 |0 h7 V" W% a) w
6 N" j% I' [( F/ ~5 a10 Direct3D中的2D
$ k2 y3 A- l A# h* ^! q( ^* Q+ O# R$ H1 a
11 Direct3D的程序结构
" t# a! | C, r. u) H. [4 ^# ]: ^4 H: v3 r! E/ r6 l
# n$ m. v6 j* j2 I% n3 t! S2 f/ b. H请注意:
. m, A9 n% L0 H/ o; H0 P* i+ ?0 E) l8 d e
因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |