S.F. Page

Programming,Music,etc...

Windowラッパーライブラリ

WASAPIのコードをマージした。

ラップしたライブラリにいままで作りためたWASAPIコードを追加した。コードの内容はすっかり忘れているのでコメントをつけながら読んでいくことにする。

動くようになった。

とりあえず動作するようにはなった。 これから何をするかといえば、これをベースにWASAPIを復習する。まずはマイクからキャプチャしそのまま再生してみようかなと思っている。

thunkコードを修正した。

thunkコードを修正した。オフセットが32bitの範囲を超えるとだめらしい。今までは偶然動いていただけみたい。我ながら恐ろしいコードだな。 // thisとhwndをつなぐthunkクラス struct hwnd_this_thunk : public Xbyak::CodeGenerator { hwnd_this_thunk(base…

コンパイルはできたものの、動作しない。

コンパイルはできたものの、thunk部分でエラーが発生。やっぱり手直しが必要か。SetWindowLongPtrの実装に切り替えようかな。

WindowsラッパーライブラリのコードをWindows8に移植してみている。

日曜日くらいからボチボチとVisual Studio Expess 2012 For Windows DesktopでWindowsラッパーライブラリのコードをWindows8に移植してみている。 やっぱりそのままではコンパイルが通らなかった。少しDirect3Dを使っているところがあるので、xnamath.hがDir…

スクリーン座標で表示できるようになった。

いろいろ弄った結果表示できるようになった。下のイメージは640×480pxの画像を板ポリに貼りつけて表示してみたものである。画像は館山の海岸の写真である。 (20,20)の位置に表示すると下のようになる。 カリング・ライティングをなしにしてX軸で板ポリを回転…

座標変換で少し頭が混乱している。

やりたい事は、Z座標が0.0のときスクリーン座標を指定するとその位置にプリミティブを表示するということ。 ワールド座標までをスクリーン座標で指定して透視変換でスクリーン座標からDirect3Dの座標系に変換して表示する。理屈がよくわかっていないのでどん…

その51 スクリーンにある2D板ポリゴンを行列で操作する

その51 スクリーンにある2D板ポリゴンを行列で操作する. このページもとても参考になる。

その5 DirectX10版高速フォント表示

その5 DirectX10版高速フォント表示. 「④ 左上(0, 0)にするために」が実装の良いヒントとなりそうだ。 DirectX7くらいのころ2Dスプライトを実装する際にかなり勉強したような気もするがほんとにすっかり忘れてしまった。。

その15 あべこべにしちゃいけないカメラと座標系とDirect3D

その15 あべこべにしちゃいけないカメラと座標系とDirect3D. ローカル座標は横方向をX座標、上方向をY座標とするので、テクスチャ座標と上下が逆さまになります(筆者はまりその2でした) そういうことでテクスチャが天地逆の件は解決!

Boost 1.49.0のビルド完了

Boost 1.49.0のビルド完了。今作っているWindowsラッパーでビルドできるかテスト。正常に完了した。 続いて座標変換のところを整理して頭に入れてコードを修正していこうか。。

視野角を求める

このエントリを図にすると下のような感じ。 image/svg+xml Depth fov(視野角) 前クリップ面Z=0.0 後クリップ面Z=100.0 視点からの距離 1.0 1.0 視点 X=-1.0 X=1.0 この図は視錐台をZX平面上で観たものである。前クリップ面がZ=0の位置にありこの面の左端が-1…

視錐台

座標変換を考えるだけど、視錐台をいじることでできることを過去のソースコードで思い出した。元々はもふぉさんが公開していた日記やライブラリでやり方を学んだもの。Z=0.0でウィンドウと大きさが一致する。つまりウィンドウサイズが640×480ドットの場合、…

座標変換を考える

これからUIをDirect3Dで描いてみることにする。私としてはせっかくの3D描画エンジンなので、ボタンとかは本物の3Dオブジェクトとして描くことにする。 ボタンは2D座標で配置して、3D座標に変換して描画する。その際必要なのがスクリーン2D座標と3D座標の変…

Boost.Geomertyを使ってみたい。

Boost.Geometryって良いライブラリらしい。ぜひ使ってみたい!ウィンドウの矩形同士の重なり部分の判定とかとても簡単にできそうなので。まあでも矩形同士程度ならそんな難しくないんだけれどね。。

ウィンドウの抽象化とかシェーダーの勉強とかHighDPIとか

ウィンドウも少し抽象化を進めないといけないかな。例えばウィンドウハンドルを直接渡さないで、ウィンドウをラップしたオブジェクトを渡すようにするとかだ。それ以外にもいろいろ抽象化するところは有りそうだ。 サンクとか継続とかジオメトリとか状態管理…

子ウィンドウの描画

子ウィンドウを作成、描画してみた。問題なく出来たけど、このやり方だとGPUのリソースを食ってしまうな。。まあしょうがないか。作ろうとしているものはそんなにウィンドウを開くアプリでもないしね。 これをベースとして本格的に実装していくことにしよう。

DWMによるウィンドウの透明化ができた。

結局DWMによるウィンドウの透明化はできた。外枠はWS_POPUPスタイルにすることにより消した。 後は子ウィンドウでも同じことができれば自前描画ウィンドウの下地としては完成だ。

リージョン付きブラーでクライアント領域外を指定してみた。

Nyaruruさんの情報を元にリージョン付きブラーで、リージョンをクライアント領域外を指定してみた。 //Create and populate the BlurBehind structre DWM_BLURBEHIND bb = {0}; //Enable Blur Behind and Blur Region; bb.dwFlags = DWM_BB_ENABLE | DWM_BB_…

DwmExtendFrameIntoClientAreaしてみた。

昨日の失敗作に画面全体をDwmExtendFrameIntoClientAreaしてみた結果。背景は完全に透明にしている。予想通りというか当たり前の結果。 これはこれで綺麗なのだけれども。ガラス効果をオフにしたいんだけどね。。

やっぱり甘かった。

「レイヤードウィンドウ以外の方法を考える」で考えたプランを試してみた。全体が半透明になるように実装したら結果は下記の通り。残念。。 AlphaBlendしてもDest DCはそのウィンドウ内のビットマップなのだから透過しないのは当たり前なのだ。バカですな、…

レイヤードウィンドウ以外の方法を考える

レイヤードウィンドウは子ウィンドウには適用できない。私としてはレイヤードウィンドウをバックバッファ代わりに使いクライアント領域外も含めて全てDirect3D11で描画しようかなと考えていた。しかし複数ウィンドウを開くアプリケーションはこの方式ではつ…

テクスチャの動的生成

テクスチャー自体を描画ターゲットにできることが分かったので、テクスチャを動的に作成して立方体に貼って回してみた。テクスチャに立方体を描いてそれをテクスチャにした立方体を回している。まあなんでもないことなんだけどちょっと面白くて。 Direct3D11…

レイヤードウィンドウ - テクスチャ経由の表示はうまくいった。

スワップチェーン経由での表示はクライアント領域しか表示出来なかったので、テクスチャにレンダリングしそれをGetDCしてUpdateLayeredWindowするように変更した。今回はうまくいった。ただ角が丸い。デフォルトでリージョンが設定してあるためだ。XPのUIの…

レイヤードウィンドウはHWアクセラレーションされるのか

「WindowのAllowsTransparencyをtrueにするとアニメーションが重くなる」を読んでいるとレイヤードウィンドウの話が何故か出てきていて、HWアクセラレーションはWPF3.5の時代からサポートしているようである。それが事実だとすれば当然Windows7でもサポート…

スワップチェーンが原因っぽい。

レイヤードウィンドウのウィンドウ枠いっぱいに表示できないのは、スワップチェーンのサーフェースがクライアント領域の大きさしか有効でないことが原因そうだ。サーフェースサイズはウィンドウサイズと同じなのだが、実際に描画されるのはクライアント領域…

レイヤードウィンドウの領域いっぱいへの描画

レイヤードウィンドウへの描画であるが、今まではクライアントエリアの大きさでUpdateLayerdWindowしていた。でも他のブログを見るとウィンドウサイズでも問題なく描画できるようなので試してみた。 しかしUpdateLayerdWindowの戻り値は成功(TRUE)にも関わら…

或るプログラマの一生 » レイヤードウィンドウのサンプルコード

或るプログラマの一生 » レイヤードウィンドウのサンプルコード. レイヤードウィンドウについて多少調べたこと レイヤードウィンドウではデフォルトのウィンドウリージョンでクリップがかかることがこのページで分かった。デフォルトのリージョンは左上・右…

レイヤードウィンドウ - 非クライアント領域の描画をどうするか

レイヤードウィンドウで試していないことの一つに、非クライアント領域の描画もできるのかということだ。これができないとウィンドウフレームを自前描画できない。UpdateLayeredWindowの2つ目の引数hdcDstぶGetWindowDCの値を渡せばいいのだろうか。DXGIサ…

レイヤードウィンドウのマウスイベント

レイヤードウィンドウのマウスイベントは透明部分は発生しない。それを検証するためにウィンドウのクライアント領域をドラッグしウィンドウを動かす処理を入れてみた。入れてみた結果が下の動画である。 立方体部分のみマウスイベントが発生するので結果立方…

GDI Hardware Acceleration

Graphics Guide for Windows 7の91-92ページにGDI Hardware Accelerationというセクションがあり、WDDM1.1ドライバの必須要件が書いてあった。引用しつつ訳してみる。 WDDM v1.1 ドライバは次の2D操作を高速化しなければならない BitBlt ColorFill StretchBl…

Graphics Guide for Windows 7

Windows 7のGDIのアクセラレーション具合やWDDM 1.1を調べるためにいまさらだが「Graphics Guide for Windows 7」を読んでいる。やはりGDIのアクセラレーションはラスタオペレーション(BitBlt)に限られるようだ。透過処理(AlphaOp)も要件にはいっているので…

DwmpDxGetWindowSharedSurface

ふぉ日記を読んでいたらDwmpDxGetWindowSharedSurfaceという隠しAPIがあると書いてあった。少し調べてみようかなと思う。

Direct3D11をもう少し深く勉強するか。

UI描画をDirect3Dで行えそうな感じになってきたものの、Direct3D11についてはチュートリアル以上の知識はまるでない。UI描画するときにどのようにすればいいのかはまだ見当がつかないのが実情である。すこしずつ理解していって見当をつけていくしか無いだろ…

立方体以外を透明化することができるようになった。

ようやく立方体以外のウィンドウ表示を透明化することができるようになった。スワップチェーンをターゲットにして描画し、スワップチェーンのサーフェースのポインタを取得、デバイスコンテキストを取得、レイヤードウィンドウを更新というやり方でできた。…

IDXGISurface1::GetDCでInvalid Call Error

スワップチェーンからIDXGISurface1へのポインタを取得することに成功したものの、その後IDXGISurface1::GetDCしようとするとInvalid Call Errorで落ちる。なんでだろう。。

スワップチェーンでもできるね

今朝はIDXGIFactory::CreateSwapChainで生成されるサーフェースをGDI互換することはできないと思っていたので、テクスチャをわざわざ作りそれを描画ターゲットにしようとしていたが、よくよく見るとDXGI_SWAP_CHAIN_DESC構造体のFlagsメンバにDXGI_SWAP_CHAI…

まずはこういう方向性で

ウィンドウモードでDirect3Dプリミティブのみを画面表示し、その他は透明化する方法はとりあえず下の手順で実現できそうな気がしてきた。 GDI互換テクスチャを作る。 そこに3Dプリミティブを描画する。 テクスチャからサーフェースを取得し、さらにDCを取得…

ウィンドウの半透明や透明化

ウィンドウの半透明や透明化について簡単に整理。 ウィンドウ・リージョン ウィンドウの表示域を不定形にできる。リージョン以外の部分は透明化される。Windows95から存在。 レイヤード・ウィンドウ ウィンドウ全体もしくは一部分を半透明および指定色を透明…

頭の中がごちゃごちゃしてきた。

DWM・レイヤードウィンドウ・Direct2D・Direct3Dについて調べていると頭のなかがごちゃごちゃしてきた。整理したいなぁとは思うけどもう少し勉強しないとだめだろうね。リージョンによる不定形ウィンドウとかWPFとかGDI・GDI+とか。使い方よりは相互の関係を…

レイヤードウィンドウ - 2通りの方法

Direct2D によるレイヤード ウィンドウを読んでいた。 記事の内容はDCをインターフェースとしてやり取りし、Direct2Dで描画時にハードウェアアクセラレーションを効かせながら最小コストでレイヤードウィンドウに画面転送する方法を解説しているものであった…

DWMを使った不定形ウィンドウを作成するには?

DWMを使った不定形ウィンドウを作成するには?. 最後のうりりすさんのポストがヒントになりそうな感じである。

Windows と C++: Direct2D によるレイヤード ウィンドウ

Windows と C++: Direct2D によるレイヤード ウィンドウ. いまやろうとしていることにヒントになりそうなドキュメント。電車の中で読むことにするか。

レイヤードウィンドウ - カラーキー - GDIで塗りつぶす

SetLayeredWindowAttributesで指定色背景を透明にする件。試しにGDIで塗りつぶすとうまくいく。 やっぱりレイヤードウィンドウの透明化をDirect3D11の描画と協調して行うにはなにか工夫が必要なのかもしれない。そもそもできないのかもしれないが。もう少し…

レイヤードウィンドウ - カラーキー

レイヤードウィンドウのAPI SetLayeredWindowAttributesでカラーキーの機能がある。これは指定した色を透明にするものだ。色指定を仮に赤(RGB(255,0,0))にして、Direct3D11で背景を赤に塗りつぶしてもうまく透明にならない。なんでだろう。半透明はうまくい…

レイヤードウィンドウ

DWMのブラー効果+レイヤードウィンドウで半透明処理をやってみた。レイヤードウィンドウの効果により、3D描画部分も半透明となっている。 レイヤードウィンドウはWS_EX_LAYEREDを指定してCreateWindowExし、SetLayeredWindowAttributesで透明度などの効果を…

天の川が流れる月ヶ浜の夜 / 西表島[TIME LAPSE PHOTOGRAPHY] 1080P

西表島の星空。こんなに綺麗なんだ。千葉の夜空とえらい違いだね。

ウィンドウのサイズ変更に対応してみた

ウインドウのサイズ変更に対応してみた。でもウィンドウの大きさが変わると立方体の大きさも変わる。射影行列とかビューポートとかのイジリ方を少し考えないといけない。 ソースコード 当面はウィンドウを消して立方体のみを表示するのが目標だけれども、最…

とりあえずテスト画面を表示できた。

とりあえずテスト画面を表示できた。背景はアルファ値が0の赤で塗りつぶしていて、Aero Glassのブラー効果で半透明となっている。立方体はDirect3D11で描いている。クライアント領域を完全に透明にするのってどうやればできるのかな。

Direct3D11コードを追加しはじめた。

Direct3D11コードを追加しはじめた。昔作りかけて放置していたDirect3D11の勉強用コードがあり、初期化部分はそのまま使えるのでコピペして追加している。下の画面は昔のテストコードを実行してみたところ。 しかしDirect3D9自体の固定パイプラインに慣れて…