プログラミング一覧

OpenGL で描画先独立なブレンディング設定を使う

OpenGL でデュアルソースブレンディングを使うと、出力先カラーバッファが1つになってしまう!という話を聞いて、「1つのカラーバッファに2色出力し、ブレンド設定でさらに演算」という場面ってどのくらいあるのだろうと疑問に思いました。(おそらくデスティネーション色と処理したいのでしょうが)。
そんな中、Multiple Render Target (MRT)で、各カラーバッファのブレンディング設定は独立に出来たはず、と思うことがあったので使い方を確認してみました。
ちなみに、DirectX11 ではカラーバッファのブレンディング設定の独立(個別)は簡単にできます。D3D11_BLEND_DESC構造体を見るとすぐに分かります。

結果としては、 OpenGL でもこのようにブレンディング設定を変えて描画できます。

続きを読む


RDPでGraphicsAPIは実行出来るか実験

前回、RDP で OpenGL アプリを起動させる方法を考えましたが、そもそも他のグラフィックスAPIではどうなのか、気になってきたので調べてみました。

RDP で動作するか?

  • OpenGL : 動作しない
  • DirectX11 : 動作する
  • DirectX12 : 動作する
  • Vulkan : 動作する

まさかの OpenGL だけが動作しないという状況だったようです。確認したのは、2台とも Windows10 1809 の環境で、デスクトップPCとノートPCという構成でした。
低レイヤーグラフィックスAPIのDirectX12/Vulkan らが RDP 経由でも使えたという点で驚きました。画面を単なる画像として送るなら、これらの動作に納得もあるのですが、かつては DirectX9 や OpenGL がリモートデスクトップ環境下で動かなかった時代を味わったために動作しないという思い込みがあったようです。

プログラムコードで考えてみると、デバイスコンテキストが不要な API だと動作しているようですね。あとは、画面ロック・UACの暗転でいわゆるデバイスロストが発生しない時代になってきたから、というのもありそうです。


リモートデスクトップで OpenGL アプリを操作したい

Windows のリモートデスクトップで OpenGL を使用したアプリケーションの起動は出来ないことは、経験上知っていたのですが、OpenGL アプリを起動した状態で、リモートデスクトップ接続すると問題なくアプリが使用できる、という話を聞きました。

RDP接続後にOpenGLアプリを起動したい

事前にOpenGLアプリを起動した状態で、他の端末から RDP で接続すれば問題なくアプリは操作できますが、事前に起動しておくことが不可能な時もあります。
また、アプリケーションを終了してしまって、再度起動したいということもあると思います。

このようなときには、 tscon コマンドを使うとよいようです。
このコマンドを用いるとセッションを切り替えることができるようなので、一度物理的なコンソールを持つセッションに切り替えてアプリケーションの起動をする、という方法が使えます。このときに、一度リモートデスクトップは切断されてしまいますが、再接続すればアプリケーションが起動した状態から再開できます。

アプリケーションの起動をするまでを次のような内容でバッチファイルにして、起動する際にはこのバッチファイルを実行するようにします。

実行する際には、管理者権限ありのコマンドプロンプトで実行してうまくいきました。一般権限のコマンドプロンプトだと、このままのバッチではうまく動作しない可能性があります。

他にもセッションのIDが必要な場面では、 “query session” を実行してみて、どのようなセッションが生きているかを見てみるのもよさそうに思います。


VisualStudio の HLSL テンプレートがおかしい その2

以前に、 VisualStudio の HLSL テンプレートがおかしい として、修正したシェーダー用のプロジェクトテンプレートですが、 Visual Studio 2017 の更新をしたら、また妙な状況になってしまったようです。
もしかすると、先の手作業の修正が引き金で新規にインストールした場合には、おかしな構造ながらも正常に動くのかもしれません。

続きを読む


Visual Studio Graphics Debugger の終了

Windows 10 October 2018 Update (1809) で、 Visual Studio 2017 の Graphics Debugger が正常に動かなくなりました。最近は Vulkan を勉強していることが多く、 VS の Graphics Debugger は使っていませんでした。再び D3D12 の勉強を再開した今日、この問題を発見しました。

最初は、今の D3D12 のために、色々と新しいインターフェースを使ったのが問題で失敗したのだろうと考えていたのですが、どうやらそうではないようです。
仕様として 1809 バージョンの上では VS 付属 Graphics Debugger は使えないということになったようです。

続きを読む


VisualStudio の HLSL テンプレートがおかしい

15.8.x のどこかのバージョンから、以下のようにシェーダーの作成の項目が減ってしまいました。
(自分の記憶では、15.8.1 の時点では大丈夫でした)。 この画面は 15.8.5 のものです。
本来ならば、ここに頂点シェーダーやピクセルシェーダー、ハルシェーダーといった項目も出現していなければなりません。

この問題を解決する方法がわかったので、これについて説明します。
なお、Professional 版、 Community 版ともに同じ問題を抱えているようです。

続きを読む


Caliburn.Micro に入門してみる その3

前回は簡単にバインディングができることを確認しました。実はあれは省略形に近いものだったので、フルに設定するとどのようになるかを今回確認します。
基本的に前回のプロジェクトの使い回しで説明します。

メソッド呼び出し

ボタンの Name を削除して、 Interaction.Triggers を指定してメソッドを呼び出してみます。

ShellView.xaml は以下のように変更します。

EventTrigger の Click までは問題ないとして、 Livet では CallMethodAction を呼び出していたような箇所で、 ActionMessage によってメソッドを呼び出します。
この ActionMessage も引数情報を設定することが可能です。パラメータを指定するには以下のようにします。

これを受け取るための IncrementCount メソッドでは引数を取れるように変更する必要があります。忘れると例外(No target found for method IncrementCount.)が飛びます。

メソッド呼び出し その2

ここまでの設定方法が Long Syntax と呼ばれるものになっているようです。次に Short Syntax と呼ばれるものについて確認してみます。

ShellView.xaml を編集してボタンを追加してみます。

見て分かるように、 cal:Message.Attach という添付プロパティでイベントとアクション(メソッド呼び出し)を設定しています。
注目なのはイベント名の記述と、メソッドの呼び出し&引数記述がこのように書ける、という点です。わかりやすいですね。

引数については即値で書いていますが、ここを他のコントロールの値にすることも可能です。

さらに Caliburn では、メソッド引数名から、引数を推測してバインディングしてくれる機能もあります。
以下のように ShellView.xaml を編集して、スライダとボタンを用意してみます。

スライダの名前を IncrementCount の引数名である delta としたことで、 Caliburn が情報をうまく解釈して結合してくれます。

まとめ

自分でバインディング設定を記述しないでもバインディングしてくれることで、プログラマの作業を省力化してくれる感がすごくあります。
ただし、ルールを知らないと動きを追いかけるのも厳しいという印象です。

これらのバインディングについては、 All About Actions を参照して読んでおくのもよさそうです。
パラメータとして、 $source, $view, $dataContext といったものも設定可能であったりするので、なかなか深いです。


Caliburn.Micro に入門してみる その2

前回はとりあえずプロジェクトを作成し、 Caliburn.Micro のお作法に従った Hello,world のようなものをやってみました。
今回はこのプロジェクトを使って、データバインディングを確認をしてみます。

今回も先人の記録を辿りつつ進めていきたいと思います。

ちなみに Caliburn.Micro の Documents の中では Basic Configuration 項にこの部分が書いてありますが、ほんの少しでした。

データバインディング

ShellViewModel に Count プロパティを追加します。

ShellView.xaml を以下のように編集してみます。

これを実行すると以下のようになります。明示的に「Text=”{Binding Count}”」 と書いていないですが、 Caliburn がこのバインド処理を行ってくれます。今回の場合、TextBlock の Name と対応するプロパティを見つけて、バインドを行う処理となっています。

コマンドバインディング

続いて以下のように ShellViewModel クラスにメソッドとプロパティを追加してみます。

そして、 ShellView.xaml も以下のように編集します。

これを実行して、 Increment ボタンを押すと、カウンタがインクリメントされ、 80 カウントになるとボタンが無効となります。

先ほどと同様にバインディングを記述していませんが、各コントロールの Name プロパティと一致するものを見つけて、バインドする処理が Caliburn によって行われるため不要となっています。Command の Can 系についても、同様に接頭辞 Can が付いたものを見つけて判定処理としてくれています。

余談

もちろん、Name を設定せずに Text=”{Binding Count}” などと記述することも可能です。 ValueConverter が必要なときには、こちらのような書き方をする必要が出てきそうです。


Caliburn.Micro に入門してみる

今まで MVVM のインフラストラクチャのライブラリとして Livet を使用していましたが、新バージョンも出ないし新しい環境用のプロジェクトテンプレートも提供が無いようだったので、比較的最近のものでよさそうなものは無いかと探してみたところ、Caliburn.Micro が良さそうだったのでこれを触ってみることにしました。

ここでは、 Nuget から簡単にインストールができる Caliburn.Micro バージョン 3.2.0 を対象にしています。また Visual Studio は 2017 (v15.6.1) を使用しています。

Caliburn.Micro について

Caliburn.Micro は出たばかりというわけでなく、5年以上経過しているというのに、日本語での記事がほぼないです。これから MVVM アーキテクチャでソフト開発を始めようと思っている人には、 Livet のほうをオススメできるのではないかと思います。 Livet のほうが日本語での検索性は良いです。

Caliburn のほうが良い点としては、対応プラットフォームが Livet よりも多いこと、現在も開発が続いていることが挙げられると思います。また、現時点においては開発者の方は Microsoft にいるらしいです。近いうちに、バージョンが 4.0 が出そうです。自分は Livet の良かった点に、プロジェクトテンプレートやらスニペットの準備やら、始めるのに楽だった点があります。 Caliburn.Micro ではそのような点は標準ではなさそうですが、普段のコード書きを楽にしてくれそうなバインディングの仕組みを提供してくれています。そして、 MEF を用いた拡張しやすそうな構成も1つの魅力に感じました。
続きを読む


Vulkan で Texture, Sampler の独立設定

Vulkan のコードにおいて、テクスチャを使用する際に、サンプラとテクスチャとをまとめている VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER を設定する箇所がありました。
よく見かけるサンプルでは、 OpenGL でテクスチャを使用するのと同じ感覚で、 サンプラとテクスチャを1体にして使っていたりします。
ここで、他の設定種別をみてみると VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE とあるので Image と Sampler は別に設定することもできるのではないか?と思いました。

続きを読む