SlideShare a Scribd company logo
1 of 20
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

What's hot

2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2dHiroshi Oyamada
 
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 たくさんの図形を動かす 静的配列と動的配列 - 芸大グラフィックスプログラミング演習BAtsushi Tadokoro
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成眞樹 冨澤
 
GLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめGLSLによるシェーダーアートことはじめ
GLSLによるシェーダーアートことはじめYoichi Hirata
 
第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成眞樹 冨澤
 
ヒカリノアトリエ演出「Avoiding object」
ヒカリノアトリエ演出「Avoiding object」ヒカリノアトリエ演出「Avoiding object」
ヒカリノアトリエ演出「Avoiding object」Atelier Frameworks
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話Moriyoshi Koizumi
 
End challenge Part1
End challenge Part1End challenge Part1
End challenge Part1hisa2
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるデジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくる
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 2: 構造をつくるAtsushi Tadokoro
 
asm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesasm.js x emscripten: The foundation of the next level Web games
asm.js x emscripten: The foundation of the next level Web gamesNoritada Shimizu
 
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーションメディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーションAtsushi Tadokoro
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Kenji Otsuka
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Etsuji Nakai
 
PSpiceのデジタル素子を活用したイメージ
PSpiceのデジタル素子を活用したイメージPSpiceのデジタル素子を活用したイメージ
PSpiceのデジタル素子を活用したイメージTsuyoshi Horigome
 
Processingによるプログラミング入門 第6回
Processingによるプログラミング入門 第6回Processingによるプログラミング入門 第6回
Processingによるプログラミング入門 第6回Ryo Suzuki
 

What's hot (20)

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

Viewers also liked

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

Viewers also liked (6)

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

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

怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミングnagoya313
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Tomoaki Shimizu
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!Masami Ichikawa
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0Yuichi Sakuraba
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaandroid sola
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Masahiko Mizuta
 
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~Fujio Kojima
 
Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Yuki Higuchi
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLAtsushi Tadokoro
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性JPCERT Coordination Center
 
NotesQueryResultsProcessor.pptx
NotesQueryResultsProcessor.pptxNotesQueryResultsProcessor.pptx
NotesQueryResultsProcessor.pptxHaruyuki Nakano
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Katsutoshi Makino
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディングAkihiro Okuno
 
UnityとBlenderハンズオン第2章
UnityとBlenderハンズオン第2章UnityとBlenderハンズオン第2章
UnityとBlenderハンズオン第2章yaju88
 
node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装Yohei Fushii
 

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

怪しいWindowsプログラミング
怪しいWindowsプログラミング怪しいWindowsプログラミング
怪しいWindowsプログラミング
 
Slide
SlideSlide
Slide
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!Cocos2d xをさらにさわってみよう!
Cocos2d xをさらにさわってみよう!
 
デバドラを書いてみよう!
デバドラを書いてみよう!デバドラを書いてみよう!
デバドラを書いてみよう!
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0
 
PF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsolaPF部2011年12月勉強会.androidsola
PF部2011年12月勉強会.androidsola
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
3D で遊ぼう ~C#er も TypeScript で楽々 WebGL~
 
Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.
 
JavaFX 2.0 への誘い
JavaFX 2.0 への誘いJavaFX 2.0 への誘い
JavaFX 2.0 への誘い
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
Apache Sling におけるサービス運用妨害(無限ループ)の脆弱性
 
NotesQueryResultsProcessor.pptx
NotesQueryResultsProcessor.pptxNotesQueryResultsProcessor.pptx
NotesQueryResultsProcessor.pptx
 
Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化Shadow gunのサンプルから学べるモバイル最適化
Shadow gunのサンプルから学べるモバイル最適化
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディング
 
UnityとBlenderハンズオン第2章
UnityとBlenderハンズオン第2章UnityとBlenderハンズオン第2章
UnityとBlenderハンズオン第2章
 
node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装node.jsによる お手軽画像uploader実装
node.jsによる お手軽画像uploader実装
 

More from ShinichiAoyagi

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

More from ShinichiAoyagi (10)

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

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

  • 1.
  • 2. http://sharpdx.org/ Direct3D DirectSound DirectDraw(DirectX 7 で終了) Direct2D (Windows 7 以降) DirectInput などなど
  • 3.
  • 4.
  • 5.
  • 6.
  • 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 の変数を渡す レンダーターゲットビュー ポリゴンの色を描画 深度バッファー ポリゴンの奥行き値を描画
  • 15.
  • 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);