[フレーム]
Uploaded byShinichiAoyagi
PPTX, PDF21,080 views

WindowsストアーアプリでSharpDXを動かしてみる

MetroStyleDeveloper (プチ) #06 大阪 〜メトロスタイルアプリ エキスパート塾++2〜で使用したセッション資料です。

Embed presentation

Downloaded 10 times
12 / 20
// 描画コールバックを開始 CompositionTarget.Rendering += CompositionTarget_Rendering; private void CompositionTarget_Rendering(object sender, object e) { int pixelWidth = (int)(this.Rectangle1.Width * DisplayProperties.LogicalDpi / 96.0); int pixelHeight = (int)(this.Rectangle1.Height * DisplayProperties.LogicalDpi / 96.0); var updateRect = new SharpDX.Rectangle(0, 0, pixelWidth, pixelHeight); DrawingPoint offset; using (var surfaceImageSourceNative = ComObject.As<SharpDX.DXGI.ISurfaceImageSourceNative>(this.surfaceImageSource)) using (var surface = surfaceImageSourceNative.BeginDraw(updateRect, out offset)) { // レンダーターゲット作成 Size renderTargetSize; RenderTargetView renderTargetView; using (var backBuffer = surface.QueryInterface<SharpDX.Direct3D11.Texture2D>()) { renderTargetSize = new Size(backBuffer.Description.Width, backBuffer.Description.Height); renderTargetView = new RenderTargetView(this.d3dDevice, backBuffer); } ...続く
19 / 20
// レンダリングパイプライン構築 this.d3dContext.InputAssembler.SetVertexBuffers(0, this.vertexBufferBinding); this.d3dContext.InputAssembler.InputLayout = this.layout; this.d3dContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; this.d3dContext.VertexShader.SetConstantBuffer(0, this.constantBuffer); this.d3dContext.VertexShader.Set(this.vertexShader); this.d3dContext.PixelShader.Set(this.pixelShader); // 定数バッファーに変換行列をセット var projection = SharpDX.Matrix.OrthoLH(4.0f, 4.0f * (float)renderTargetSize.Height / (float)renderTargetSize.Width, 0f, 2f); var worldViewProjection = SharpDX.Matrix.RotationZ(2f * (float)Math.PI * (float)DateTime.Now.Millisecond / 1000f) * projection; worldViewProjection.Transpose(); this.d3dContext.UpdateSubresource(ref worldViewProjection, this.constantBuffer, 0);
http://sharpdx.org/ Direct3D DirectSound DirectDraw(DirectX 7 で終了) Direct2D (Windows 7 以降) DirectInput などなど
<Rectangle x:Name="Rectangle1" ...以下略.../>
using SharpDX; using SharpDX.Direct3D; using SharpDX.Direct3D11; using SharpDX.DXGI; using SharpDX.IO; // Direct3D デバイス private SharpDX.Direct3D11.Device1 d3dDevice; // Direct3D コンテキスト private SharpDX.Direct3D11.DeviceContext1 d3dContext;
// Direct3D デバイスの取得 var creationFlags = DeviceCreationFlags.VideoSupport | DeviceCreationFlags.BgraSupport | DeviceCreationFlags.Debug; using (var defaultDevice = new SharpDX.Direct3D11.Device(DriverType.Hardware, creationFlags)) { this.d3dDevice = defaultDevice.QueryInterface<SharpDX.Direct3D11.Device1>(); } // Direct3D コンテキストを取得 this.d3dContext = d3dDevice.ImmediateContext.QueryInterface<SharpDX.Direct3D11.DeviceContext1>();
using Windows.Graphics.Display; using Windows.UI.Xaml.Media.Imaging; // SurfaceImageSource private SurfaceImageSource surfaceImageSource;
// SurfaceImageSource の作成 int pixelWidth = (int)(this.Rectangle1.Width * DisplayProperties.LogicalDpi / 96.0); int pixelHeight = (int)(this.Rectangle1.Height * DisplayProperties.LogicalDpi / 96.0); this.surfaceImageSource = new SurfaceImageSource(pixelWidth, pixelHeight); var brush = new ImageBrush(); brush.ImageSource = this.surfaceImageSource; this.Rectangle1.Fill = brush; using (var surfaceImageSourceNative = ComObject.As<SharpDX.DXGI.ISurfaceImageSourceNative>(this.surfaceImageSource)) { surfaceImageSourceNative.Device = this.d3dDevice.QueryInterface<SharpDX.DXGI.Device>(); }
// 描画コールバックを開始 CompositionTarget.Rendering += CompositionTarget_Rendering; private void CompositionTarget_Rendering(object sender, object e) { int pixelWidth = (int)(this.Rectangle1.Width * DisplayProperties.LogicalDpi / 96.0); int pixelHeight = (int)(this.Rectangle1.Height * DisplayProperties.LogicalDpi / 96.0); var updateRect = new SharpDX.Rectangle(0, 0, pixelWidth, pixelHeight); DrawingPoint offset; using (var surfaceImageSourceNative = ComObject.As<SharpDX.DXGI.ISurfaceImageSourceNative>(this.surfaceImageSource)) using (var surface = surfaceImageSourceNative.BeginDraw(updateRect, out offset)) { // レンダーターゲット作成 Size renderTargetSize; RenderTargetView renderTargetView; using (var backBuffer = surface.QueryInterface<SharpDX.Direct3D11.Texture2D>()) { renderTargetSize = new Size(backBuffer.Description.Width, backBuffer.Description.Height); renderTargetView = new RenderTargetView(this.d3dDevice, backBuffer); } ...続く
...続き // ビューポート作成 Viewport viewport = new Viewport(0, 0, (int)renderTargetSize.Width, (int)renderTargetSize.Height, 0.0f, 1.0f); // レンダーターゲット、ビューポートをセット this.d3dContext.OutputMerger.SetTargets(renderTargetView); this.d3dContext.Rasterizer.SetViewports(viewport); // 背景クリア this.d3dContext.ClearRenderTargetView(renderTargetView, Colors.Red); // レンダリング this.d3dContext.Draw(36, 0); surfaceImageSourceNative.EndDraw(); } }
頂点シェーダー GPU で頂点座標を計算 ピクセルシェーダー GPU で各ピクセルの色を計算 頂点レイアウト GPU に頂点の配置順を教える 頂点バッファー 頂点の集まり 頂点インデックス 頂点の並び順 定数バッファー GPU の変数を渡す レンダーターゲットビュー ポリゴンの色を描画 深度バッファー ポリゴンの奥行き値を描画
// 頂点シェーダー private VertexShader vertexShader; // ピクセルシェーダー private PixelShader pixelShader; // 頂点レイアウト private InputLayout layout; // 頂点バッファー private VertexBufferBinding vertexBufferBinding; // 定数バッファー private SharpDX.Direct3D11.Buffer constantBuffer;
// 頂点シェーダー、ピクセルシェーダーの読み込み、作成 var installPath = Windows.ApplicationModel.Package.Current.InstalledLocation.Path; var vertexShaderByteCode = NativeFile.ReadAllBytes(Path.Combine(installPath, "SimpleVertexShader.cso")); this.vertexShader = new VertexShader(this.d3dDevice, vertexShaderByteCode); this.pixelShader = new PixelShader(this.d3dDevice, NativeFile.ReadAllBytes(Path.Combine(installPath, "SimplePixelShader.cso"))); // 頂点レイアウト作成 this.layout = new InputLayout(this.d3dDevice, vertexShaderByteCode, new[] { new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0) }); ...続く
...続き // 頂点バッファー作成 var vertices = SharpDX.Direct3D11.Buffer.Create(this.d3dDevice, BindFlags.VertexBuffer, new[] { new Vector4( 0.0f, 1.3f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front new Vector4( 1.1f, -0.6f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), new Vector4(-1.1f, -0.6f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), }); this.vertexBufferBinding = new VertexBufferBinding(vertices, Utilities.SizeOf<Vector4>() * 2, 0); // 定数バッファー作成 this.constantBuffer = new SharpDX.Direct3D11.Buffer(d3dDevice, Utilities.SizeOf<SharpDX.Matrix>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
// レンダリングパイプライン構築 this.d3dContext.InputAssembler.SetVertexBuffers(0, this.vertexBufferBinding); this.d3dContext.InputAssembler.InputLayout = this.layout; this.d3dContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; this.d3dContext.VertexShader.SetConstantBuffer(0, this.constantBuffer); this.d3dContext.VertexShader.Set(this.vertexShader); this.d3dContext.PixelShader.Set(this.pixelShader); // 定数バッファーに変換行列をセット var projection = SharpDX.Matrix.OrthoLH(4.0f, 4.0f * (float)renderTargetSize.Height / (float)renderTargetSize.Width, 0f, 2f); var worldViewProjection = SharpDX.Matrix.RotationZ(2f * (float)Math.PI * (float)DateTime.Now.Millisecond / 1000f) * projection; worldViewProjection.Transpose(); this.d3dContext.UpdateSubresource(ref worldViewProjection, this.constantBuffer, 0);
http://code.msdn.microsoft.com/windowsapps/site/search?f%5B0%5D.Type=Tech nology&f%5B0%5D.Value=DirectX

More Related Content

ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
PDF
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
今さら始めるCoffeeScript
KEY
今さら始めるCoffeeScript
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
PPTX
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
How to make Inn-fighting dice
PPTX
How to make Inn-fighting dice
Backbone model collection (jscafe 8)
PDF
Backbone model collection (jscafe 8)
シェーダーしよっ☆ Let's play shaders!
KEY
シェーダーしよっ☆ Let's play shaders!
機械学習
PPTX
機械学習
CG2013 12
PPTX
CG2013 12
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
今さら始めるCoffeeScript
今さら始めるCoffeeScript
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
How to make Inn-fighting dice
How to make Inn-fighting dice
Backbone model collection (jscafe 8)
Backbone model collection (jscafe 8)
シェーダーしよっ☆ Let's play shaders!
シェーダーしよっ☆ Let's play shaders!
機械学習
機械学習
CG2013 12
CG2013 12

What's hot

Hbstudy41 auto scaling
PDF
Hbstudy41 auto scaling
Aaなゲームをjsで
PDF
Aaなゲームをjsで
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
PDF
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
PDF
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
Processingによるプログラミング入門 第6回
PDF
Processingによるプログラミング入門 第6回
PSpiceのデジタル素子を活用したイメージ
PPT
PSpiceのデジタル素子を活用したイメージ
第10回 計算機構成
PDF
第10回 計算機構成
Goをカンストさせる話
PDF
Goをカンストさせる話
Algorithm 速いアルゴリズムを書くための基礎
PPT
Algorithm 速いアルゴリズムを書くための基礎
Halide for Memory
PDF
Halide for Memory
GLSLによるシェーダーアートことはじめ
PDF
GLSLによるシェーダーアートことはじめ
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
PPTX
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
PDF
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
End challenge Part1
PDF
End challenge Part1
2012 03-03-titanium plusquicktigame2d
PDF
2012 03-03-titanium plusquicktigame2d
Cocoa勉強会201208
KEY
Cocoa勉強会201208
asm.js x emscripten: The foundation of the next level Web games
PDF
asm.js x emscripten: The foundation of the next level Web games
Haskell勉強会 14.1〜14.3 の説明資料
PDF
Haskell勉強会 14.1〜14.3 の説明資料
第12回計算機構成
PDF
第12回計算機構成
ヒカリノアトリエ演出「Avoiding object」
PPTX
ヒカリノアトリエ演出「Avoiding object」
Hbstudy41 auto scaling
Hbstudy41 auto scaling
Aaなゲームをjsで
Aaなゲームをjsで
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
Processingによるプログラミング入門 第6回
Processingによるプログラミング入門 第6回
PSpiceのデジタル素子を活用したイメージ
PSpiceのデジタル素子を活用したイメージ
第10回 計算機構成
第10回 計算機構成
Goをカンストさせる話
Goをカンストさせる話
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
Halide for Memory
Halide for Memory
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめ
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
End challenge Part1
End challenge Part1
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
Cocoa勉強会201208
Cocoa勉強会201208
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web games
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料
第12回計算機構成
第12回計算機構成
ヒカリノアトリエ演出「Avoiding object」
ヒカリノアトリエ演出「Avoiding object」

Viewers also liked

Windows ストアーアプリで SQLite を使ってみよう
PPTX
Windows ストアーアプリで SQLite を使ってみよう
XAML 入門
PPTX
XAML 入門
"なめらか"なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
PPT
"なめらか"なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
トランザクションの設計と進化
PPTX
トランザクションの設計と進化
LINQ概要
PPTX
LINQ概要
LINQ の概要とかもろもろ
PPTX
LINQ の概要とかもろもろ
Windows ストアーアプリで SQLite を使ってみよう
Windows ストアーアプリで SQLite を使ってみよう
XAML 入門
XAML 入門
"なめらか"なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
"なめらか"なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~
トランザクションの設計と進化
トランザクションの設計と進化
LINQ概要
LINQ概要
LINQ の概要とかもろもろ
LINQ の概要とかもろもろ

Similar to WindowsストアーアプリでSharpDXを動かしてみる

Shadow gunのサンプルから学べるモバイル最適化
PPTX
Shadow gunのサンプルから学べるモバイル最適化
3D で遊ぼう 〜C#er も TypeScript で楽々 WebGL〜
PPTX
3D で遊ぼう 〜C#er も TypeScript で楽々 WebGL〜
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
PDF
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
Android OpenGL HandsOn
PDF
Android OpenGL HandsOn
板ポリだけで めちゃカッコいい グラフィックスを出す!
PDF
板ポリだけで めちゃカッコいい グラフィックスを出す!
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
PDF
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
シェーダー伝道師 第一回
PPTX
シェーダー伝道師 第一回
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
PDF
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
Flashup13 Basic Training of Flare3D
PDF
Flashup13 Basic Training of Flare3D
WebGL and Three.js
PDF
WebGL and Three.js
Cocos2dshader devcon jp_20120621_en
PDF
Cocos2dshader devcon jp_20120621_en
【Unity道場 2月】シェーダを書けるプログラマになろう
PDF
【Unity道場 2月】シェーダを書けるプログラマになろう
知覚動考、とりあえずShaderを書いてみる
PPTX
知覚動考、とりあえずShaderを書いてみる
簡単!OpenGL ES 2.0フラグメントシェーダー
PDF
簡単!OpenGL ES 2.0フラグメントシェーダー
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
PDF
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
Direct3D 12 Summary
PDF
Direct3D 12 Summary
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
PDF
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
PDF
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
PDF
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
Visual Studio 2012のDirect3Dアプリ開発者向け新機能を知ろう
PPTX
Visual Studio 2012のDirect3Dアプリ開発者向け新機能を知ろう
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化
3D で遊ぼう 〜C#er も TypeScript で楽々 WebGL〜
3D で遊ぼう 〜C#er も TypeScript で楽々 WebGL〜
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
【TechBuzz】第9回cocos2d-x勉強会「シェーダ書いてますか?」
Android OpenGL HandsOn
Android OpenGL HandsOn
板ポリだけで めちゃカッコいい グラフィックスを出す!
板ポリだけで めちゃカッコいい グラフィックスを出す!
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
シェーダー伝道師 第一回
シェーダー伝道師 第一回
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
【Unite Tokyo 2018】カスタムシェーダーでモバイルでも最先端グラフィックスな格闘ゲームを!
Flashup13 Basic Training of Flare3D
Flashup13 Basic Training of Flare3D
WebGL and Three.js
WebGL and Three.js
Cocos2dshader devcon jp_20120621_en
Cocos2dshader devcon jp_20120621_en
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
知覚動考、とりあえずShaderを書いてみる
知覚動考、とりあえずShaderを書いてみる
簡単!OpenGL ES 2.0フラグメントシェーダー
簡単!OpenGL ES 2.0フラグメントシェーダー
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
CEDEC 2020 - 高品質かつ低負荷な3Dライブを実現するシェーダー開発 〜『ラブライブ!スクールアイドルフェスティバル ALL STARS』(スク...
Direct3D 12 Summary
Direct3D 12 Summary
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
Unity道場京都スペシャル トゥーンシェーディングとノンフォトリアリスティック風絵づくり入門_
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
Visual Studio 2012のDirect3Dアプリ開発者向け新機能を知ろう
Visual Studio 2012のDirect3Dアプリ開発者向け新機能を知ろう

More from ShinichiAoyagi

メトロスタイルってなに?
PPTX
メトロスタイルってなに?
メトロスタイルアプリ開発 最初の一歩
PPTX
メトロスタイルアプリ開発 最初の一歩
WPF & Windows Forms on .NET Core 3.0
PPTX
WPF & Windows Forms on .NET Core 3.0
LINQ 概要 + 結構便利な LINQ to XML
PPTX
LINQ 概要 + 結構便利な LINQ to XML
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
PPTX
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
Xamarin+MVVMCross のあれこれ
PPTX
Xamarin+MVVMCross のあれこれ
ついに日本上陸!Windows Phone 7.5 アプリケーション開発
PPT
ついに日本上陸!Windows Phone 7.5 アプリケーション開発
C# と .NET と ・・・
PPTX
C# と .NET と ・・・
うるう秒とタイムゾーン
PPTX
うるう秒とタイムゾーン
Visual Studio 2015 + Xamarin
PPTX
Visual Studio 2015 + Xamarin
メトロスタイルってなに?
メトロスタイルってなに?
メトロスタイルアプリ開発 最初の一歩
メトロスタイルアプリ開発 最初の一歩
WPF & Windows Forms on .NET Core 3.0
WPF & Windows Forms on .NET Core 3.0
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
【18-C-5】C# で iOS/Androidアプリ開発 - Visual Studio 2015 + Xamarin + MVVMCross -
Xamarin+MVVMCross のあれこれ
Xamarin+MVVMCross のあれこれ
ついに日本上陸!Windows Phone 7.5 アプリケーション開発
ついに日本上陸!Windows Phone 7.5 アプリケーション開発
C# と .NET と ・・・
C# と .NET と ・・・
うるう秒とタイムゾーン
うるう秒とタイムゾーン
Visual Studio 2015 + Xamarin
Visual Studio 2015 + Xamarin

WindowsストアーアプリでSharpDXを動かしてみる

  • 2.
    http://sharpdx.org/ Direct3D DirectSound DirectDraw(DirectX 7 で終了) Direct2D (Windows 7 以降) DirectInput などなど
  • 7.
  • 8.
    using SharpDX; using SharpDX.Direct3D; using SharpDX.Direct3D11; using SharpDX.DXGI; using SharpDX.IO; // Direct3D デバイス private SharpDX.Direct3D11.Device1 d3dDevice; // Direct3D コンテキスト private SharpDX.Direct3D11.DeviceContext1 d3dContext;
  • 9.
    // Direct3D デバイスの取得 var creationFlags = DeviceCreationFlags.VideoSupport | DeviceCreationFlags.BgraSupport | DeviceCreationFlags.Debug; using (var defaultDevice = new SharpDX.Direct3D11.Device(DriverType.Hardware, creationFlags)) { this.d3dDevice = defaultDevice.QueryInterface<SharpDX.Direct3D11.Device1>(); } // Direct3D コンテキストを取得 this.d3dContext = d3dDevice.ImmediateContext.QueryInterface<SharpDX.Direct3D11.DeviceContext1>();
  • 10.
    using Windows.Graphics.Display; using Windows.UI.Xaml.Media.Imaging; // SurfaceImageSource private SurfaceImageSource surfaceImageSource;
  • 11.
    // SurfaceImageSource の作成 int pixelWidth = (int)(this.Rectangle1.Width * DisplayProperties.LogicalDpi / 96.0); int pixelHeight = (int)(this.Rectangle1.Height * DisplayProperties.LogicalDpi / 96.0); this.surfaceImageSource = new SurfaceImageSource(pixelWidth, pixelHeight); var brush = new ImageBrush(); brush.ImageSource = this.surfaceImageSource; this.Rectangle1.Fill = brush; using (var surfaceImageSourceNative = ComObject.As<SharpDX.DXGI.ISurfaceImageSourceNative>(this.surfaceImageSource)) { surfaceImageSourceNative.Device = this.d3dDevice.QueryInterface<SharpDX.DXGI.Device>(); }
  • 12.
    // 描画コールバックを開始 CompositionTarget.Rendering += CompositionTarget_Rendering; private void CompositionTarget_Rendering(object sender, object e) { int pixelWidth = (int)(this.Rectangle1.Width * DisplayProperties.LogicalDpi / 96.0); int pixelHeight = (int)(this.Rectangle1.Height * DisplayProperties.LogicalDpi / 96.0); var updateRect = new SharpDX.Rectangle(0, 0, pixelWidth, pixelHeight); DrawingPoint offset; using (var surfaceImageSourceNative = ComObject.As<SharpDX.DXGI.ISurfaceImageSourceNative>(this.surfaceImageSource)) using (var surface = surfaceImageSourceNative.BeginDraw(updateRect, out offset)) { // レンダーターゲット作成 Size renderTargetSize; RenderTargetView renderTargetView; using (var backBuffer = surface.QueryInterface<SharpDX.Direct3D11.Texture2D>()) { renderTargetSize = new Size(backBuffer.Description.Width, backBuffer.Description.Height); renderTargetView = new RenderTargetView(this.d3dDevice, backBuffer); } ...続く
  • 13.
    ...続き // ビューポート作成 Viewport viewport = new Viewport(0, 0, (int)renderTargetSize.Width, (int)renderTargetSize.Height, 0.0f, 1.0f); // レンダーターゲット、ビューポートをセット this.d3dContext.OutputMerger.SetTargets(renderTargetView); this.d3dContext.Rasterizer.SetViewports(viewport); // 背景クリア this.d3dContext.ClearRenderTargetView(renderTargetView, Colors.Red); // レンダリング this.d3dContext.Draw(36, 0); surfaceImageSourceNative.EndDraw(); } }
  • 14.
    頂点シェーダー GPU で頂点座標を計算 ピクセルシェーダー GPU で各ピクセルの色を計算 頂点レイアウト GPU に頂点の配置順を教える 頂点バッファー 頂点の集まり 頂点インデックス 頂点の並び順 定数バッファー GPU の変数を渡す レンダーターゲットビュー ポリゴンの色を描画 深度バッファー ポリゴンの奥行き値を描画
  • 16.
    // 頂点シェーダー private VertexShader vertexShader; // ピクセルシェーダー private PixelShader pixelShader; // 頂点レイアウト private InputLayout layout; // 頂点バッファー private VertexBufferBinding vertexBufferBinding; // 定数バッファー private SharpDX.Direct3D11.Buffer constantBuffer;
  • 17.
    // 頂点シェーダー、ピクセルシェーダーの読み込み、作成 var installPath = Windows.ApplicationModel.Package.Current.InstalledLocation.Path; var vertexShaderByteCode = NativeFile.ReadAllBytes(Path.Combine(installPath, "SimpleVertexShader.cso")); this.vertexShader = new VertexShader(this.d3dDevice, vertexShaderByteCode); this.pixelShader = new PixelShader(this.d3dDevice, NativeFile.ReadAllBytes(Path.Combine(installPath, "SimplePixelShader.cso"))); // 頂点レイアウト作成 this.layout = new InputLayout(this.d3dDevice, vertexShaderByteCode, new[] { new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0), new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 16, 0) }); ...続く
  • 18.
    ...続き // 頂点バッファー作成 var vertices = SharpDX.Direct3D11.Buffer.Create(this.d3dDevice, BindFlags.VertexBuffer, new[] { new Vector4( 0.0f, 1.3f, 1.0f, 1.0f), new Vector4(1.0f, 0.0f, 0.0f, 1.0f), // Front new Vector4( 1.1f, -0.6f, 1.0f, 1.0f), new Vector4(0.0f, 1.0f, 0.0f, 1.0f), new Vector4(-1.1f, -0.6f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), }); this.vertexBufferBinding = new VertexBufferBinding(vertices, Utilities.SizeOf<Vector4>() * 2, 0); // 定数バッファー作成 this.constantBuffer = new SharpDX.Direct3D11.Buffer(d3dDevice, Utilities.SizeOf<SharpDX.Matrix>(), ResourceUsage.Default, BindFlags.ConstantBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
  • 19.
    // レンダリングパイプライン構築 this.d3dContext.InputAssembler.SetVertexBuffers(0, this.vertexBufferBinding); this.d3dContext.InputAssembler.InputLayout = this.layout; this.d3dContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; this.d3dContext.VertexShader.SetConstantBuffer(0, this.constantBuffer); this.d3dContext.VertexShader.Set(this.vertexShader); this.d3dContext.PixelShader.Set(this.pixelShader); // 定数バッファーに変換行列をセット var projection = SharpDX.Matrix.OrthoLH(4.0f, 4.0f * (float)renderTargetSize.Height / (float)renderTargetSize.Width, 0f, 2f); var worldViewProjection = SharpDX.Matrix.RotationZ(2f * (float)Math.PI * (float)DateTime.Now.Millisecond / 1000f) * projection; worldViewProjection.Transpose(); this.d3dContext.UpdateSubresource(ref worldViewProjection, this.constantBuffer, 0);
  • 20.

AltStyle によって変換されたページ (->オリジナル) /