主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

IronPython: Direct3D(Direct3D11)でDevice作成

                
 Windowsでゲームを作るならXNAフレームワーク……だったのだが、マイクロソフトから開発の終了が宣言された。で、Windowsでゲーム作ったりグラフィックをさわりたかったら、Direct3Dが選択肢の一つ。このDirect3DというのはXP,VISTA,7と進歩するごとに、バージョンアップが進められている。今回はWindows 7以降を対象環境としたDirect3D11をIronPythonからいじってみる。

 IronPythonからDirect3Dを使うには.NET Framework環境でDirect3Dを使用できるようにしたラッパーを使うのが楽。有名どころではSlimDXSharpDXがある。今回はSlimDXを使ったが、両者とも開発はすでにかなり進んだ段階にあるようで、差異はうすいようだ。

 SlimDXにあるチュートリアルのC#コードをIronPythonスクリプトに置き換えてみる。まずは下記で見られるDeviceの初期化から。
http://slimdx.org/tutorials.php

C#ではrefやoutによる参照渡しが使われる。Pythonではそれがない。必要な部分では下記を参考にした。
http://ironpython.net/documentation/dotnet/dotnet.html#ref-and-out-parameters
http://www.voidspace.org.uk/ironpython/dark-corners.shtml#out-and-ref-parameters

C#
Device device;
SwapChain swapChain;
Device.CreateWithSwapChain(DriverType.Hardware,
DeviceCreationFlags.None,
description,
out device,
out swapChain);

IronPython
deviceOut = clr.Reference[Device]()
swapChainOut = clr.Reference[SwapChain]()
Device.CreateWithSwapChain(DriverType.Hardware,
DeviceCreationFlags.None,
description,
deviceOut,
swapChainOut)
device = deviceOut.Value
swapChain = swapChainOut.Value


まずはクラス化せずに、順番を追いやすいままにしたのが以下。
import clr
clr.AddReference("SlimDX")

from SlimDX import *
from SlimDX.Direct3D11 import *
from SlimDX.DXGI import *
from SlimDX.Windows import *
from SlimDX.Direct3D11 import Device
from SlimDX.Direct3D11 import Resource

form = RenderForm("Tutorial 2: Device Creation")
description = SwapChainDescription()
description.BufferCount = 1
description.Usage = Usage.RenderTargetOutput
description.OutputHandle = form.Handle
description.IsWindowed = True
description.ModeDescription = ModeDescription(0, 0, Rational(60, 1), Format.R8G8B8A8_UNorm)
description.SampleDescription = SampleDescription(1, 0)
description.Flags = SwapChainFlags.AllowModeSwitch
description.SwapEffect = SwapEffect.Discard

deviceOut = clr.Reference[Device]()
swapChainOut = clr.Reference[SwapChain]()
Device.CreateWithSwapChain(DriverType.Hardware,
DeviceCreationFlags.None,
description,
deviceOut,
swapChainOut)
device = deviceOut.Value
swapChain = swapChainOut.Value

# create a view of our render target, which is the backbuffer of the swap chain we just created
resource = Resource.FromSwapChain[Texture2D](swapChain, 0)
renderTarget = RenderTargetView(device, resource)

# setting a viewport is required if you want to actually see anything
context = device.ImmediateContext
viewport = Viewport(0.0, 0.0, form.ClientSize.Width, form.ClientSize.Height)
context.OutputMerger.SetTargets(renderTarget)
context.Rasterizer.SetViewports(viewport)

# prevent DXGI handling of alt+enter, which doesn't work properly with Winforms
factory = swapChain.GetParent[Factory]()
factory.SetWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAltEnter)


# handle alt+enter ourselves
def KeyEvent(o, e):
if (e.Alt and e.KeyCode == Keys.Enter):
swapChain.IsFullScreen = not swapChain.IsFullScreen;
form.KeyDown += KeyEvent


def main():
# clear the render target to a soothing blue
context.ClearRenderTargetView(renderTarget, Color4(0.5, 0.5, 1.0))
swapChain.Present(0, PresentFlags.None)
MessagePump.Run(form, main)

renderTarget.Dispose()
swapChain.Dispose()
device.Dispose()


1304101.jpg

*****************************
その他
http://www.ironpython.info/index.php/Direct3D_-_Creating_a_Device_with_SlimDX
↑のところにDirect3D9のサンプルがある。これをDirect3D11で動かそうと考えたところ、Deviceクラスのメンバーがかなり変わっていた。


http://www.scapecode.com/category/net/
↑のブログでIronPythonのサンプルを見つけたが、エラーが出る。
            

コメントの投稿

非公開コメント

プロフィール

Matoba

Author:Matoba

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。