前言: & h5 V9 n5 D. f3 L/ w e# ]
- {& m& R# ?# P9 l, n5 s% ^% r
这篇教程是为初学者准备的,只要会简单的VC++编程以及一点立体几何的基础知识即可。通过它,可以了解到Direct3D的基本概念,学会绘制简单的几何图形,并掌握光源、材质和纹理的基本用法。
! c$ s7 w0 l3 A2 x) F7 ]1 N) Z2 d4 k. k. |8 O
3D绘图的实质就是在二维计算机屏幕上创建三维幻觉,为此要用到一些数学变换来建模和处理几何图形。我将尽可能用通俗易懂的语言来解释这些变换及其用法,避免涉及复杂的数学知识。
! O+ Z+ ^; S; G
4 a+ R5 }7 S) r# \ t1 开发环境
' n& ~# X1 { d8 f, O" K* _( w. n1 `8 G
本文选用VC++ 6.0做语言环境,建议安装Service Pack5补丁包。为了创建Direct3D程序,需要从微软网站下载安装DirectX SDK,我用的是最新的9.0版,大概200多兆,网址 http://www.microsoft.com/downloads/ 。安装完SDK后,开发环境就搭建好了。当然,要运行编译好的程序,DirectX9是必不可少的(微软已经在SDK中包含了DirectX9的安装文件)。 ; V) l i7 Q. T3 G% @
% ^. L# y6 p# \, S) P0 Z$ u, v! V+ @
DirectX9 SDK为VC用户提供了一个程序向导,可以很方便地生成“空”的Direct3D程序。不过为了便于读者掌握Direct3D编程的基础知识,本文将以MFC单文档程序(SDI)为框架,在其上添加Direct3D绘图功能。 6 q% L6 o" _2 `0 [/ c% G
- z: c8 C3 D9 B! o; v2 使用COM组件 9 o& d0 c3 Q6 w. D6 p0 C6 }5 r
/ D8 g9 x; X6 C; j" R7 m W: [! F# \6 V
DirectX的功能都是以COM组件的形式提供的。COM是组件对象模型(Component Object Model)的简写,它是一种协议,用来实现软件模块间的二进制连接。当这种连接建立后,两个模块之间就可以通过称为“接口(Interface)”的机制来通信。我们常用的ActiveX控件就是一种COM组件。
1 m/ |9 ?) p. [6 J: l' v8 h/ t- Q0 Z* [- M1 d* O
COM的实现细节相当复杂,完全可以写一本厚厚的专著。不过别担心,微软已经为我们最大限度地简化了COM的使用,即便你对COM一窍不通也没关系。作为Direct3D开发人员,只要了解接口及其用法就行了:所谓接口,其实就是一组特殊的C++对象,应用程序通过调用这些对象的成员函数,来访问COM组件,实现组件的功能。在COM术语中,这些成员函数被称作方法(Method)。虽然称呼变了,但其调用语法与普通的C++对象相比,并无二致。接口的特殊性在于它的生成和销毁都由系统完成,无须用户干预。
; ~/ }2 o1 \0 E) f! ]
6 \3 _( f* F% y3 w0 E' n在Direct3D编程中,我们要做的工作基本上可以归纳为: c/ h; z: c+ y0 q* N) j6 I
- V! H" s. @+ |* C
调用适当的函数获取接口指针;
- F* J/ [6 C9 Y( H0 F! `( j, v8 G, U0 |
调用接口的方法(成员函数)来完成所需功能;
; R/ x% w2 S& G) c2 \( |+ k; r+ ?- X2 q# J! S
用完接口后,调用Release方法进行“释放”,注意释放顺序应该和获取它们的顺序相反。 ' P. Q1 q j t- r1 j) m6 P
- b+ J0 x( m" U: _$ g
! z- ]3 ~' X! ^
3 第一个程序-初始化Direct3D
) y5 |2 f' Z2 q9 O; I- i8 q$ A. Q9 u
3.1 创建程序框架 5 f/ W M! F( G3 c; q
& v7 i6 n# r+ W( i6 v8 ^& O
3.2 初始化Direct3D
; Q, J& M. l! c3 x, n' l* V+ O8 l% F
3.3 渲染
/ n8 c" q* \& \- E
: k& ^8 f- i O3.4 释放接口
) W$ z( W* `$ W8 @" @- A v V4 U
4 画一个三角形
8 c6 \. ]" b# C' M
$ h0 m" s1 v# e7 n4.1 一些数学概念
' j5 I1 b6 [$ V' S( ~% I. l7 b: S7 C/ u) i
4.2 画一个三角形
" P7 M5 e7 Z6 _+ X0 \1 W( N; q6 u' v! r+ N* n2 i
5 画一个三棱锥-索引缓存和Z缓存 - Q* C* G; S5 m* v2 Q
; B! x, L0 F8 n* n8 G2 B* K5 t5.1 什么是索引缓存
9 P8 D7 u, E2 g8 ~4 b1 d; Q9 l- I8 K
5.2 创建索引缓存 % [) @3 e _! {$ E" A( h
& |5 A, G7 x7 y3 P: i" T$ l8 g5.3 渲染索引缓存
- J6 h, W7 M* A; j& W) @6 Y; K! D
! I4 w" V; R5 \; f5.4 打开Z缓存
! c+ X' c2 d+ W# ]1 U! Y& T( d
* j( {: I; @. L' c$ q* G6 画一个圆锥-灯光和材质 : {% ]4 A) g% |9 Q! M, {
* J1 p* s% J6 W7 s6.1基本概念 9 |4 l3 O6 V; J, G' d3 ]
- Z# b" a2 Q% g1 I x6 q0 R
6.2 灯光
( i6 k+ z- c! j, T& w, O7 a7 \* ?3 [* @" j- H* q" H7 u9 r/ D' q% |
6.3 材质 / v0 E6 S: d7 C( J
- K( f. _ i# a, { j6.4 画一个圆锥 - J2 h$ E2 T% {
+ T* \! C5 s$ i+ j( S6.5高洛德着色和平面着色
6 n* n1 N( D2 D6 ^% H# X3 n l* g5 A) y9 Q+ B
7 为圆锥添加纹理 , X, N8 M- A2 B! w4 x
/ {& W3 A, R( S) F* d8 G) K
7.1 基本概念 9 z8 Z" j- W/ ^7 X, Y5 \* m/ i2 C
7 f: w. n' G( M" s, f2 b( \' U
7.2 创建纹理 3 Q% W, O, R! ?" Q0 J
; C4 m& R) t/ B
7.3 用纹理渲染 2 C: e8 n( v# m- u9 L7 A1 L
, c: c5 D4 B2 e# I" Z3 g8 Mesh模型
/ j! D, h3 G( o) `: X9 d0 Z# |7 A' @: B1 p$ q! z' z
8.1 什么是Mesh模型
: {5 z) L i6 S3 A, F) G4 U0 w8 g: A$ Z' ~" O3 ]4 D: |8 Z
8.2 绘制Mesh模型
7 F( {- d5 j2 l* c; e; V% e
3 g4 F8 ?) E) j. F9 显示文本 % ]8 l6 X# L$ ~4 s
9 f& A$ k5 T$ h0 U: |9 r
10 Direct3D中的2D
3 y1 ~: d3 m% v2 a# o' Y2 K2 }3 U& [ i
11 Direct3D的程序结构
& l c) t1 j+ X$ [/ E' R3 o3 _
+ N u& h. w2 i9 V- e! Z* d
$ A, N" E! |' Q. k- G请注意:
8 I# Y2 c" p; x& X6 S4 F3 p/ I8 e- m4 F: Q3 E8 `
因为原文章使用PDF格式编写,且文章比较长,插图多,不太容易转贴,感兴趣的同志请从下列地址下载全文 |