- 积分
- 59
UID200669
主题
在线时间 小时
注册时间2006-11-16
|
发表于 2006-11-17 14:42:52
|
显示全部楼层
|阅读模式
来自: 中国贵州黔东南苗族侗族自治州
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
The Direct3D 设备
' Y5 C0 B W9 Q) a& P6 G ) K+ C/ h( I% Z
: k1 ]7 n1 a! B% u1 i1 K# K
所有的有关绘图的Direct3D类的根就是device类,你可以认为这个类就是你电脑中的真实设备,所有在你所绘制的场景中的的图形对象都是从这个类衍生出来的。
5 W) C8 {. @3 |5 ^7 H% u
, @$ X. }" s9 v+ j0 K' h- Q+ U" o5 N8 u3 g& H [
在这里,device有三个构造函数,现在,我们只准备使用其中的一个,在后面的章节中,我们将介绍另外的构造函数。
! t* s D- D9 N我们要使用的函数原型和参数说明如下
$ W3 K$ D; i9 g$ mpublic Device 6 j0 @! H" O0 t' Y
(
8 y% {$ s; p8 ySystem.Int32 adapter ,8 S$ y& B% M4 j0 k9 y$ |
Microsoft.DirectX.Direct3D.DeviceType deviceType ,
! ^" {: R; |6 R# K# r1 Y, GSystem.Windows.Forms.Control renderWindow ,
& G" ]: N. _3 r" l8 K$ hMicrosoft.DirectX.Direct3D.CreateFlags behaviorFlags, Microsoft.DirectX.Direct3D.PresentParameters presentationParameters , [! p- g6 A! k T. O, D
)
3 {( o$ L3 \; C5 q* x5 D第一个是你的物理显示卡的设备豪,一般是0;* G t- y8 S* g1 S
第二个参数deviceType,是告诉Direct3d你要建立的设备类型,一般使用DeviceType.Hardware,意思是你建立一个硬件设备类型,还有一个参数值是DeviceType.Reference,标准类型,除非是在进行调试的时候采用这个参数,其他时候是不必要的,因为会使你的程序运行得非常非常的慢。他打开的光栅,或者是在测试显示卡是否支持光栅功能时使用
. ~: _' p& @& y+ G: Q- }5 c H第三个是enderWindow,他告诉程序使用什么来呈现你所需要的场景,我们一般使用this,这里代表使用本窗口来呈现
2 F) ?8 s$ f# k: M' @) |' t* _. r第四个behaviorFlags是设备建立以后的表示幅,这样说吧,我们使用的是软件顶点处理,也就是说所有的多边形定点建立都是由cpu来完成的,不用显卡完成,这样的话,速度确实比直接使用显卡完成要慢一些,但是我们还不清楚是否所有使用本程序的人的显卡是否支持这个特性,所以为了安全起见,我们在这里参数中设置为cpu完成模型建立的工作- I0 s5 [$ C i$ y
presentationParameters 比较麻烦,我们这里只是设置的是否全屏显示,其实他还包括一些设置,如后台缓冲区的高度、宽度和像素格式,以及从后台缓冲区复制到前台缓存屏幕显示的方式等等。如果Direct3D采用窗口方式运行,像素格式必须查询当前的显示模式获得
# _: O% ]- ?2 }, O" ?9 |9 h( y& S 7 I( q: A5 ^$ H% m3 k
0 \$ F0 \$ o+ `0 }) q. z$ Y, N- N! S
6 B; \7 U9 [' A' g: `5 ]% K
好了,参数也介绍完了,现在我们开始来建立我们的第一个设备吧,首先,和所有c#语言一样,我们必须先申请一个设备,我们可以在frme1类下面申请一个设备5 j! _2 R2 W! ^" A8 ~
private Device device = null;
9 L( u6 @, @" z& {然后,我们建立一个初始化函数来初始化我们的设备,这里就要用到刚刚所讲的构造函数了。% N7 Y, h; h! l
public void InitializeGraphics()
8 r* K6 N) n; y q5 A& H' E{
8 {, {+ ?' p: \9 n; r+ G* c // 设置参数/ m' }! B) T0 [5 Z6 w2 U
" Y6 R7 d; |; V% m! W1 D7 |. q4 s0 a2 f3 B, z+ I& c
PresentParameters presentParams = new PresentParameters();
# q8 \) z* m! W0 y$ p' X- Y 5 P1 G9 c/ e/ q- u
7 o) P! {$ J3 z5 q9 v presentParams.Windowed = true; //窗口模式0 @' T* K$ N, y& E) V
presentParams.SwapEffect = SwapEffect.Discard; //交换
! M/ _( L: L: V9 W- [ " H9 U% ?) W9 F% e# w. D
; W, s; F! Z( T. O: U1 n
// 创建设备4 O% l1 j6 e# O. Q: C( s3 T
device = new Device(0, DeviceType.Hardware, this,: l( U6 L3 x5 \- H5 V# C
CreateFlags.SoftwareVertexProcessing, presentParams);; F4 H0 w: B! p7 @4 s2 p4 e
}0 A1 q5 j' \5 Z, |8 i# {# d
% D6 u% q! U$ @# X; r
, G4 e) _( E- p0 C0 I
7 \5 r6 }9 A4 B% J# P在这里,建立设备以前,我们申请了一个presentParams(表达参数),来设置一些我们所关心的地方,比如窗口模式和双缓存,然后建立设备,按照上面的参数,我们建立一个这样的设备,它使用我们的第一块显卡,硬件加速,在本类(也就是我们的windows窗口)中呈现场景,使用cpu建立多边形顶点,并且是窗口模式,使用SwapEffect9 z4 o& m/ V) J% Q& h
4 S& [6 m0 x. G. Q% {- Y4 U
|! N9 f2 _0 `5 P
接下来,我们要来调用这个函数以便设备的真正建立。
9 L9 H' u: `5 m: y$ Zstatic void Main() a. z8 C& U; B% J) i0 j) e3 u
{
% A, i4 P( T8 F1 p7 x% {" X2 y) P using (Form1 frm = new Form1())
8 l, e- S+ Q2 M% J1 S; f& A1 ^' h {
' V% [$ U8 \; ~: ^8 m ~ // 显示窗口并初始化
: `2 ` q8 J% R; a& e frm.Show();
# o8 p" u) t5 O' y7 m frm.InitializeGraphics();% {0 B1 I+ l. W' P) _! `; h4 A' n
Application.Run(frm);! g5 d, o: \* V x
}! r2 E2 C; @" X& a6 u, D
}
_1 G) a- I6 X+ r: l! l - t$ W" w, D' V6 K0 o
; O, h$ l' ]1 f
这里代码就不多说了,大家都可以看懂9 R8 ]0 Z! R* I1 U' k! E# Q/ \4 O
注意以下,这里修改了.NET默认的代码,使用了using 语句和show(),是为了确保程序的安全性,可以保证在我们建立我们的设备以前,windows窗口已经建立并且加载完全。我建议大家以后写的时候都这样。) D- Q; R+ A' t2 ]' I& e' Z2 a
好了,现在你可以编译代码了。现在,就是我们所建立的第一个Direct3D程序) B" \- z) Z8 I4 e3 W+ s4 C8 A: i
; u6 `) f- @# m0 j( ^6 b
: \8 ~& e2 H+ w1 Z: Z' j. u' n. ~3 |- a4 m
; d* o9 _+ _6 ]# G F" w0 L% Q. ?" R6 _/ }( Z- }0 O3 [
呵呵,这里程序虽然十分的简单,但是它已经是一个完整意义上的Direct3D程序了,在DirectX9.c发布以后,通过c#语言这样的描述,Direct3D程序编写起来比用c++要简单得过了,而且随着.net平台的主导地位逐渐加强,这种感觉将越来越明显。
# V& ?! o4 a4 f. N: b# u! j不过,老美的东西仍旧是老美的东西,我们再怎么样,现在看来也不过是个民工,别人给好了图纸,我们只是砌房子,这点,在我找资料的时候就发现了,中文文档,连翻译的都非常非常少,更别说原创的了。所以,我在这里把我看得英文文档逐渐翻译过来,希望能给大家帮助,让我们之中也多几个画图纸的而不是砌房子的。呵呵~~~~~ c! E$ C1 b; F% Y
: @* O$ O% m; p, Z# q& `[ 本帖最后由 开亮 于 2009-10-24 20:08 编辑 ] |
|