VBでDirectX8


VBの基礎
プロシャージャ
孤度法

 VBでDirectX8 SDKを使えるようにする

DirectX SDKを入手する
DirectX

ヘルプを入手する
DirectX 8.0日本語ドキュメント (Visual Basic 開発者向け)
DirectX 8.0 Visual Basic 開発者ドキュメントは、Microsoft Windows 95、Windows 98、Windows ME、Windows 2000 向けのものです。


[1]参照設定
メニューから「プロジェクト」→「参照設定」
「参照可能なライブラリファイル」から「DirectX 8 fow Visual Basic Type Library」にチェックする

[2]そのた
Form1 のScaleModeプロパティを3-ピクセルに変更

 オブジェクトの取り扱い

[1]オブジェクトへの参照を格納する変数の宣言

Dim 変数名 as 各機能のオブジェクト型

オブジェクト型の前に「New」キーワードをつけると変数の宣言と同時にオブジェクトを生成できる。 DirectX8
Dim 変数名 as New 各機能のオブジェクト型


[2]宣言した変数にオブジェクトへの参照を代入
Set 変数名 = 生成したオブジェクト


[3]確保されたメモリの開放
Set 変数名 = Nothing


 画像描画のための処理手順

画像を描画するための手順

1. 初期化
2. 描画処理
3. 解放


1.初期化
┣初期化の手順
┣各種オブジェクトの宣言
┣Direct3Dオブジェクト生成 Direct3DCreate
┣ディスプレイモードの取得 GetAdapterDisplayMode
┣プレゼンテーションパラメータの設定 D3DPRESENT_PARAMETERS
┗Direct3DDevice8デバイスの生成 CreateDevice

初期化の手順
Dim DX As New DirectX8 'DirectXシステム
Dim D3D As Direct3D8  'Direct3Dシステム 環境設定
Dim D3DDevice As Direct3DDevice8 '描画デバイス

Direct3Dオブジェクト生成
Set D3D = DX.Direct3DCreate() 'D3Dシステム生成

ディスプレイモードの取得 GetAdapterDisplayMode
ディスプレイの解像度、色数、リフレッシュレートなどのディスプレイに関する情報。
[object].GetAdapterDisplayMode( [Adapter] As Long, [Mode] As D3DDISPLAYMODE)
[object]
Direct3D8 オブジェクトを表すオブジェクト式。
[Adapter]
D3DADAPTER_DEFAULT は常にプライマリ ディスプレイ アダプタである。
[Mode]
現在のアダプタのモードを記述する情報が格納される D3DDISPLAYMODE 型。

Dim D3DDM As D3DDISPLAYMODE 'ディスプレイモード格納構造体
Set D3D = DX.Direct3DCreate() 'D3Dシステム生成

D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, D3DDM 'ディスプレイモードを取得


プレゼンテーションパラメータの設定 D3DPRESENT_PARAMETERS
ディスプレイへの出力方法を決める情報
解像度、色数、フリッピングの方法、Zバッファの種類、スクリーンモード、など。
Dim D3DPP As D3DPRESENT_PARAMETERS 'ディスプレイパラメータ格納構造体

'プレゼンテーションパラメータの設定
With D3DPP 'プレゼンテーションパラメータの設定
.Windowed = True 'ウインドモード (True=ウインドウ False=フルスクリーン)
.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC '画面の更新方法(フリッピング)
.BackBufferFormat = D3DDM.Format 'ディスプレイのフォーマット
.AutoDepthStencilFormat = D3DFMT_D16 '16ビット深度バッファ
.EnableAutoDepthStencil = True '深度処理の有効化

' .BackBufferHeight = D3DDM.Height '垂直解像度 フルスクリーン時に必要
' .BackBufferWidth = D3DDM.Width '水平解像度 フルスクリーン時に必要

End With

Direct3DDevice8デバイスの生成 CreateDevice
描画処理や座標の移動処理などの設定
[object].CreateDevice( _
[Adapter] As Long, _
[DeviceType] As CONST_D3DDEVTYPE, _
[hFocusWindow] As Long, _
[BehaviorFlags] As Long, _
[PresentationParameters] As D3DPRESENT_PARAMETERS) As Direct3DDevice8
[object]
Direct3D8 オブジェクトを表すオブジェクト式。

[Adapter]
D3DADAPTER_DEFAULT は常にプライマリ ディスプレイ アダプタである。

[DeviceType]
D3DDEVTYPE_HAL ラスタ化とシェーディングはハードウェアで行う。
D3DDEVTYPE_REF リファレンスデバイス
D3DDEVTYPE_SW  ソフトウェアデバイス

[hFocusWindow]
Me.hWndを指定。

[BehaviorFlags]
D3DCREATE_PUREDEVICE ハードウェアによるラスタ化、T&L、およびシェーディング
D3DCREATE_HARDWARE_VERTEXPROCESSING ハードウェアによる頂点処理
D3DCREATE_MIXED_VERTEXPROCESSING ソフトウェアとハードウェア両方による頂点処理
D3DCREATE_SOFTWARE_VERTEXPROCESSING ソフトウェアによる頂点処理

[PresentationParameters]
作成するデバイスのプレゼンテーション パラメータを示す D3DPRESENT_PARAMETERS 型。


'D3Dデバイスの生成
On Error Resume Next 'エラーが出ても次の行を実行

Set D3DDevice = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DPP) 'D3Dデバイス生成
'D3DDEVTYPE_HAL ハードウェアで絵画指定 機種依存?


If D3DDevice Is Nothing Then 'D3Dデバイスが生成できない場合
 Set D3DDevice = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DPP)
'D3DDEVTYPE_REF リファレンスドライバ(ソフトウェア 使用する)

 If D3DDevice Is Nothing Then 'ハード、ソフトとも使用出来ない時は‥
  Call ReleaseObject '★開放処理
  End
 End If
End If


2.描画処理
┣ビューポートの消去 Clear
┣レンダリングを開始 BeginScene
┣レンダリングを終了 EndScene
┗フリッピング処理を行う Present

ビューポートの消去 Clear
画像を表示するためには、表示する領域を初期化する必要がある。
[object].Clear( _
[Count] As Long, _
[ClearD3DRect] As Any,
[Flags] As CONST_D3DCLEARFLAGS, _
[Color] As Long, _
[Z] As Single, _
[Stencil] As Long)
[Count]
0 を指定

[ClearD3DRect]
ByVal 0 を指定

[Flags]
D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER を指定。

[Color]
塗りつぶしの色

[Z]
1# を指定

[Stencil]
0を指定

'描画準備
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &HFFFFFF, 1#, 0 'ビューポートの消去

フリッピング処理を行う Present
画面の表示処理、バックバッファからのコピー処理など
[object].Present( _
[SourceRect] As Any, _
[DestRect] As Any, _
[DestWindowOverride] As Long, _
[DirtyRegion] As Any)
[SourceRect]
0 を指定

[DestRect]
ByVal 0 を指定

[DestWindowOverride]
0 を指定
[DirtyRegion]
ByVal 0 を指定

D3DDevice.Present 0, ByVal 0, 0, ByVal 0 '画面の表示(フリッピング)

3.解放処理
┗解放処理を行う Nothing

開放処理 Nothing
DirectX8のオブジェクトは使用時にオブジェクト用のメモリを確保する。
これは終了時に解放処理をしなければならない。
Set DX = Nothing

Set D3D = Nothing
Set D3DDevice = Nothing

 3次元オブジェクトの作成

3次元オブジェクトの作成には、3つの方法がある。

1.頂点バッファを使う
2.D3DXオブジェクトを使う
3.既存のデータを使う

1.頂点バッファを使う
┣頂点バッファ (頂点構造体の変数を宣言)
┣頂点フォーマット (頂点構造体の型を定義) CONST_D3DFVFFLAGS
┣頂点構造体の初期化 (頂点データの格納) CUSTOMVERTEX
┣頂点バッファの作成 CreateVertexBuffer
┗バッファへの頂点データの格納 D3DVertexBuffer8SetData







頂点バッファ頂点構造体の変数を宣言
Dim VertexBuffer As Direct3DVertexBuffer8 '頂点バッファ

頂点フォーマット CONST_D3DFVFFLAGS
頂点バッファ内の頂点の内容を記述する FVF フラグを定義する
Const D3DFVF_CUSTOMVERTEX = (D3DFVF_XYZRHW Or D3DFVF_DIFFUSE)

カスタム頂点タイプの定義
Private Type CUSTOMVERTEX
    x As Single         'スクリーン空間での x
    y As Single         'スクリーン空間での y
    z As Single         '正規化された z
    rhw As Single       '正規化された rhw
    color As Long       '頂点カラー
End Type

頂点構造体の初期化 (頂点データの格納) CUSTOMVERTEX
3 つの頂点に三角形のポイントを設定し、各頂点が放射する色を指定する。
Dim Vertex(3) As CUSTOMVERTEX '三角形の頂点を格納するカスタム頂点構造体

With Vertices(0)
 .x = 150: .y =  50: .z = 0.5: .rhw = 1: .color = &HFFFF0000
End With
With Vertices(1)
 .x = 250: .y = 250: .z = 0.5: .rhw = 1: .color = &HFF00FF00
End With
With Vertices(2)
 .x =  50: .y = 250: .z = 0.5: .rhw = 1: .color = &HFF00FFFF
End With

頂点バッファの作成 CreateVertexBuffer
[object].CreateVertexBuffer( _
[LengthInBytes] As Long, _
[Usage] As Long, _
[FVF] As Long, _
[Pool] As CONST_D3DPOOL) As Direct3DVertexBuffer8
[LengthInBytes]
頂点バッファのサイズ

[Usage]
0 を指定

[FVF]
柔軟な頂点フォーマット(FVF)フラグの組み合わせ。
D3DFVF_CUSTOMVERTEX

[Pool]
D3DPOOL_DEFAULT を指定

Set VertexBuffer = D3DDevice.CreateVertexBuffer(VertexSize * 3, 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT) '頂点バッファの作成

バッファへの頂点データの格納 D3DVertexBuffer8SetData
D3DVertexBuffer8SetData( _
[VBuffer] As Direct3DVertexBuffer8, _
[Offset] As Long, _
[Size] As Long, _
[Flags] As Long, _
[Data] As Any) As Long
[VBuffer]
データを設定する頂点バッファを表す、Direct3DVertexBuffer8 オブジェクト。

[Offset]
バッファの先頭からデータが設定される位置までのオフセット (バイト単位)。

[Size]
バッファのサイズ (バイト単位)。

[Flags]
実行するロックのタイプを記述する、CONST_D3DLOCKFLAGS 列挙によって定義される 1 つ以上の有効なロッキング フラグの組み合わせ。
[Data]
設定するデータを格納するバッファ。

D3DVertexBuffer8SetData VertexBuffer, 0, VertexSize * 3, 0, Vertex(0) '頂点データを格納

 3次元オブジェクトの描画

1.頂点バッファを使う
┣バックバッファのクリア Cleae
┣描画の開始 BeginScene
┣ストリームソースの設定 SetStreamSource
┣頂点シェーダの通知 SetVertexShader
┣頂点バッファの内容を描画 DrawPrinmitive
┣シーンの終了 EndScene
┗フリッピング処理 Present

バックバッファのクリア Cleae
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFFFFFF, 1#, 0 'ビューポートの消去

描画の開始 BeginScene
D3DDevice.BeginScene 'レンダリング開始

ストリームソースの設定 SetStreamSource
[object].SetStreamSource( _
[StreamNumber] As Long, _
[StreamDat]a As Direct3DVertexBuffer8, _
[Stride] As Long)
[StreamNumber]
0 からストリームの最大数 -1 までの範囲のデータ ストリームを指定する。

[StreamData]
指定したデータ ストリームに対してバインドする頂点バッファを表す Direct3DVertexBuffer8 オブジェクト。

[Stride]
成分のストライド (バイト単位)。

D3DDevice.SetStreamSource 0, VertexBuffer, SizeOfvertex 'ストリームの設定

頂点シェーダの通知 SetVertexShader
D3DDevice.SetVertexShader D3DFVF_CUSTOMVERTEX '頂点シェーダの設定

頂点バッファの内容を描画 DrawPrinmitive
object.DrawPrimitive( _
[PrimitiveType] As CONST_D3DPRIMITIVETYPE, _
[StartVertex] As Long, _
[PrimitiveCount] As Long)
[PrimitiveType] レンダリングするプリミティブの種類を記述する。
D3DPT_POINTLIST 別個のポイントの集合として頂点をレンダリングする。
D3DPT_LINELIST 別個の線分のリストとして頂点をレンダリングする。
D3DPT_LINESTRIP 単一のポリラインとして頂点をレンダリングする。
D3DPT_TRIANGLELIST 別個の三角形の連続として指定の頂点をレンダリングする。
D3DPT_TRIANGLESTRIP 頂点を三角形ストリップとしてレンダリングする。
D3DPT_TRIANGLEFAN 頂点を三角形ファンとしてレンダリングする。

[StartVertex ]
ロードする最初の頂点のインデックス。StartVertex を先頭に、正しい頂点数が頂点バッファから読み取られる。

[PrimitiveCount]
レンダリングするプリミティブの数。

D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 1 '三角形の描画

シーンの終了 EndScene
D3DDevice.EndScene 'レンダリング終了

フリッピング処理 Present
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0 '画面の表示

2.メッシュを使う
┣メッシュの分割数取得 GetNumVertices
┣バックバッファのクリア Cleae
┣描画の開始 BeginScene
┣(トランスフォーム)
┣メッシュの描画 DrawSubset
┣シーンの終了 EndScene
┗フリッピング処理 Present


メッシュは、頂点バッファを使って作ったオブジェクトとは異なる描画方法を使います。
メッシュは数回に分けてD3DXMeshオブジェクトに格納される、この回数を分割数という
メッシュ描画の際は、分割されたメッシュを1つに組み立てて描画する、よって
メッシュを描画する際は必ず分割数を取得する

メッシュの分割数取得 GetNumVertices
[object].GetNumVertices() As Long

メッシュに含まれる頂点の数を返す。
Dim Mesh As D3DXMesh 'メッシュ格納用
Dim MeshDevideCount As Long 'メッシュの分割数
Dim i As Long 'メッシュの分割数ループ用カウンタ

Set Mesh = D3DX.CreateTeapot(D3DDevice, Nothing) '球のメッシュを作成
MeshDevideCount = Mesh.GetNumVertices() '球のメッシュ頂点数を取得

メッシュの描画 DrawSubset
For i = 0 To MeshDevideCount - 1 'メッシュの分割数だけループ
Mesh.DrawSubset i '分割されたメッシュを描画
Next i '

シーンの終了 EndScene
D3DDevice.EndScene 'レンダリング終了

フリッピング処理 Present
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0 '画面の表示

Dim Mesh As D3DXMesh 'メッシュ格納用
Dim Ma_1 As D3DMATERIAL8 'マテリアル用

'-------------- Dim MeshDevideCount As Long '球のメッシュ分割数
Dim i As Long '繰り返し処理用

Call SetupSunMatrix1 '★マトリクス処理 表示座標
Set Mesh = D3DX.CreateSphere(D3DDevice, 1, 20, 20, Nothing) '球のメッシュを作成
MeshDevideCount = Mesh.GetNumVertices() '球のメッシュ頂点数を取得

'マテリアル設定
Ma_1.diffuse.r = 0.5
Ma_1.diffuse.g = 1
Ma_1.diffuse.b = 1
Ma_1.diffuse.a = 1
D3DDevice.SetMaterial Ma_1 'ディフェーズ反射色を設定

For i = 0 To MeshDevideCount - 1 'メッシュの分割数だけループ
Mesh.DrawSubset i '分割されたメッシュを描画
Next i '
'--------------- 必要分繰り返す

'デイスプレイに表示
D3DDevice.EndScene 'レンダリング終了
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0 '画面の表示



3.Xフアイルの利用

 ワールドトランスフォーム

ワールドトランスフォーム
┣ワールド行列作成 (算術関数を使用)
┣D3DMATRIX型の箱に行列を格納 
┗行列適用(ワールドトランスフォーム) D3DDevice.SetTransform

ワールド行列作成 (算術関数を使用)
3次元オブジェクトを操作するための行列を生成する
Dim Matrix As D3DMATRIX 'マトリクス

1.拡大、縮小 D3DMatrixScaling
2.回転 D3DMatrixRotationZ
3.平行移動 D3DMatrixTranslation
4.行列の掛け合わせ D3DXMatrixMultiply

1.拡大、縮小
D3DMatrixScaling Matrix,0.5,0.5,0.5 '1/2に縮小する行列の生成

2.回転 軸を中心として回転
D3DMatrixRotationZ Matrix,PI/4 '回転用行列の生成

 任意の軸を中心として回転
With VAxis
.x=1,.y=0,.z=1
End with

D3DMatrixRotationAxis Matrix,VAxis, -PI/4 '回転用行列の生成

回転の例
Dim RotationMatrix As D3DMATRIX '回転用マトリクス
Dim Axis as D3DVECTOR '回転軸角度
Static Theta As Integer '回転角度
Static PI As Integer 'ラジアン単位

Axis.x = 0.3 'X
Axis.y = 1# 'Y
Axis.z = 0 'Z
PI = 3.1415 '円周率
Theta = Theta + 1.0 '回転角度設定
If Theta = 2 * PI then Theta = 0 '
D3DXMatrixRotationAxis RotationMatrix, Axis,Theta '回転用マトリクス設定

3.平行移動
D3DMatrixTranslation Matrix,-1.5, -1.2, 0 '平行移動用行列の生成

移動の例
Dim TranslationMatrix As D3DMATRIX '移動用マトリクス
Static X As Integer '位

X = X + 0.1
D3DXMatrixTranslation TranslationMatrix, X,0,0 '移動用マトリクス設定

4.行列の掛け合わせ D3DXMatrixMultiply

行列適用(ワールドトランスフォーム) D3DDevice.SetTransform
D3DDevice.SetTransform D2DTS_WORLD, MatWorld

 ビュートランスフォーム

ビュートランスフォーム
┣ビュー行列作成 (算術関数を使用)
┗行列適用(ビュートランスフォーム)

 射影トランスフォーム

 光源

1.有向光源(ディレクショナリ、ライト)
2.点光源
3.スポットライト
4.環境光

1.有向光源(ディレクショナリ、ライト)
┣光源の持つ属性の設定 D3DLIGHT8
┣属性のDirect3Dへの通知 .SetLight
┣光源の有効化 .LightEnable
┗光源を適用 .SetRenderState

光源の有効化 .SetLight
D3DDevice.SetLight 0, DirectionalLight '光源を生成

光源の有効化 .LightEnable
D3DDevice.LightEnable 0, 1 '光源を有効化

光源を適用 .SetRenderState
D3DDevice.SetRenderState D3DRS_LIGHTING, 1 '光源を適用


'変数の宣言
Dim DirectionalLight As D3DLIGHT8 '光源
Dim LightColor As D3DCOLORVALUE '光源の色

'光源の設定
DirectionalLight.Type = D3DLIGHT_DIRECTIONAL '有向光源に設定
With DirectionalLight.Direction '光源の方向に関する設定
.x = 1#
.y = -3#
.z = 1#
End With

With LightColor '光源の色に関する設定
.r = 1#
.b = 1#
.g = 1#
.a = 1#
End With

DirectionalLight.diffuse = LightColor 'ディフューズ反射色を設定

'光源をDirect3Dデバイスに適用
D3DDevice.SetLight 0, DirectionalLight '光源を生成
D3DDevice.LightEnable 0, 1 '光源を有効化
D3DDevice.SetRenderState D3DRS_LIGHTING, 1 '光源を適用


2.点光源
'変数の宣言
Dim PointLight As D3DLIGHT8 '光源
Dim LightColor As D3DCOLORVALUE '光源の色
Dim LightPosition As D2DVECTOR '位置
'光源の設定
DirectionalLight.Type = D3DLIGHT_POINT '点光源に設定
With LightColor '光源の色に関する設定
.r = 1#
.b = 1#
.g = 1#
.a = 1#
End With

With LightPosition '光源の位置に関する設定
.x=10:.y-10:.z=10
End With

PointLight.Ambient = LightColor 'アンビエント反射の設定
PointLight.diffuse = LightColor 'ティフェーズ反射の設定
PointLight.specular = LightColor 'スペキュラー反射の設定
PointLight.Position = LightPosition '光源の位置
PointLight.Attenuation0 = 1 '光の減衰を設定
PointLight.Attenuation1 = 0 '
PointLight.Attenuation2 = 0 '
PointLight.Range = 500 '光源の限界距離


3.スポットライト
'変数の宣言
Dim SpotLight As D3DLIGHT8 '光源
Dim LightColor As D3DCOLORVALUE '光源の色
Dim LightPosition As D2DVECTOR '位置
'光源の設定
DirectionalLight.Type = D3DLIGHT_POINT '点光源に設定
With LightColor '光源の色に関する設定
.r = 1
.b = 1
.g = 1
End With

With LightPosition '光源の位置に関する設定
.x=10:.y-10:.z=10
End With

SpotLight.Ambient = LightColor 'アンビエント反射の設定
SpotLight.diffuse = LightColor 'ティフェーズ反射の設定
SpotLight.specular = LightColor 'スペキュラー反射の設定
SpotLight.Position = LightPosition '光源の位置
SpotLight.Attenuation0 = 1 '光の減衰を設定
SpotLight.Attenuation1 = 0 '
SpotLight.Attenuation2 = 0 '
SpotLight.Range = 500 '光源の限界距離
SpotLight.Phi = 1.0 '暗影部の範囲指定
SpotLight.Theta = 2.0 '明部の範囲指定
SpotLight.Falloff = 1.0 'フィールオフの設定


4.環境光
D3DDevice.setRenderState D3DRS_AMBIENT, &H80FF80 '環境光の設定

 マテリアル

属性の設定

マテリアルの有効化 SetMaterial

 テクスチャ

テクスチャ利用手順
┣テクスチャをファイルから読み込む CreateTextureFromFile
┣テクスチャの情報を描画デバイスに通知 SetTexture
┗テクスチャの貼り付け SetTextureStageState

テクスチャをファイルから読み込む CreateTextureFromFile
[object].CreateTextureFromFile( _
[Device] As Direct3DDevice8, _
[SrcFile] As String) As Direct3DTexture8

[Device]
D3DX8 オブジェクト

[SrcFile]
テクスチャファイル名

 フォグ

 Xフアイルの利用








TOP