2009-01-01から1ヶ月間の記事一覧

HLSLで影の描画 -シャドウマップ-

シェーダをさらに使ってみよう、ということで影を描画してみます。 影を描画する方法はいろいろありますが、今回はシャドウマップを使います。 参考サイト その44 深度バッファシャドウの根っこ:0から原理を眺めてみよう シャドウマップの実装方法は上記の…

C#でツールを作る その16 -PropertyGridを使ってみる-

超便利ですね。PropertyGridまじパネェっす! C#を使い始めて以来、多分最も感動したのではないかと。 昨日までC#のプロパティとは、 「get、setメソッドを多少簡単に記述できるようにしただけ」 と勝手に思い込んでいたのですが、 PropertyGridを使ってみて…

C#でツールを作る その15.1 -ランバート反射-

もっとも単純なライティングですね。 輪郭線もシェーダで描画したいので、はちゅねのモデルから面を反転した黒いメッシュを削除しました。 サンプル download VC#2008EE VertexShader2.0 PixelShader2.0 miku miku01.x miku01.fx miku01.mqo miku.dds miku.j…

C#でツールを作る その15 -HLSLを使ってみる-

今ではシェーダも一般的になっているようなので、私もちょっと遊んでみようと思います。とりあえず、最低限必要なものを。 Effectオブジェクトの作成と破棄 コンパイルエラーがあるとerrに文字列返ってくる private Effect effect = null; String err; //コ…

C#でツールを作る その14 -スクリーン座標をワールド座標に変換-

数学は苦手です! 数式だけ書かれてもわかりませんっ!! 図を描いて下さい。 とりあえず、スクリーン座標p(x,y)のワールド座標q(x',y',z')を求めます。 逆行列による2Dから3Dへの逆変換 カメラと被写体の間に3Dのスクリーンがあると考え、その平面上…

C#でツールを作る その14.1 -マウスではちゅねを動かす-

サンプル tool14_1.zip VC#2008EE用 「menu」→「file」→「open」から適当なモデルを選択してください。 ZX平面上のマウス座標を求めてTranslationに設定する world_mouse = ScreenToWorld( screen_mouse ); device.Transform.World = Matrix.Translation( To…

C#でツールを作る その12.2 -Modelクラス-

Mesh、Material、Textureの管理が面倒になってきたのでクラス化しましょう。 サンプル tool12_2.zip VC#2008EE用 Modelクラス IDisposableの実装 描画メソッド Model生成メソッド class Model : IDisposable { private Mesh mesh = null; private Material[]…

C#でツールを作る その12.1 -ぐるぐるほっぺ-

大事なものを忘れていました。 サンプル download VC#2008EE用 αブレンド αブレンドを有効にする device.RenderState.AlphaBlendEnable ブレンド係数 SourceBlend:DestinationBlend=α:1−α device.RenderState.AlphaBlendEnable = true; device.RenderSta…

C#でツールを作る その13 -メニューからモデルを開く-

サンプル tool13.zip VC#2008EE用 OpenFileDialog ツールボックスから「OpenFileDialog」を追加 ダイアログを表示する openFileDialog1.ShowDialog() OKボタン(開く)を押したときの処理はイベントで追加可能 openFileDialog1.FileOk とりあえずモデルファ…

C#でツールを作る その11 -AttributeBuffer-

1つのMesh内に複数のMaterialが存在するとき、AttributeBufferを使うと便利です。 サンプル tool11.zip VC#2008EE用 参考 http://www.devmaster.net/forums/showthread.php?t=5956 AttributeBuffe 各FaceにMaterial番号を設定して、Meshを最適化する 隣接性…

C#でツールを作る その12 -XファイルからMeshを生成-

前回、頂点バッファ、インデックスバッファ、属性バッファから直接Meshを構築しましたが、毎回このようにMeshを作ると面倒なので、Xファイルからロードしてみます。Xファイルには以下の内容が含まれます。(メタセコから生成されるXファイル) 頂点配列 イン…

C#でツールを作る その9 -キューブの作成-

3Dの基本ということで、キューブを作ってみましょう。 頂点データ 3D頂点座標、頂点色 CustomVertex.PositionColored 頂点数:8 CustomVertex.PositionColored[] v = new CustomVertex.PositionColored[ 8 ]; v[ 0 ] = new CustomVertex.PositionColored( -…

C#でツールを作る その8 -カメラの制御-

C#

3Dのツールなので、マウスのドラッグ・ホイールによるカメラの制御は必須です。 ということで、以下の機能を追加します。 右ドラック:カメラの回転 ホイール:ズーム サンプル tool08.zip VisualC#2008EE用 極座標 カメラの回転の実装方法はいろいろありま…

C#でツールを作る その10 -ライティング-

影(shadow)ではなく、陰(shade)ですね。 表面の模様はテクスチャを使うので、今回から頂点色は使いません。 マテリアル Material[] material = new Material[ 1 ]; material[ 0 ].Diffuse = Color.White; material[ 0 ].Ambient = material[ 0 ].Diffuse…

C#でツールを作る その9.1 -Meshクラス-

前回のエントリでは、VertexBufferとIndexBufferを自分で作って描画していましたが、 複数のモデルを描画する際、モデル毎にVertexBuffer、IndexBufferを作るのは大変です。 モデルクラス的なものを自作してもいいですがそれも面倒です。ということで、Direc…

C#でツールを作る その4 -2Dポリゴン-

3Dの前に軽く2Dをやってみます。 サンプル tool04.zip VisualC#2008 ExpressEdition用 DrawUserPrimitives()で描画 まずは頂点バッファを使わずに頂点配列を直接渡します。 2D頂点座標、頂点色 CustomVertex.TransformedColored 頂点配列を直接渡す private …

C#でツールを作る その7 -グリッドと軸の描画-

グリッドと軸 3D頂点座標、頂点色 CustomVertex.PositionColored 1辺が1のラインをX方向、Z方向にそれぞれ11本=11*2ライン X軸、Y軸、Z軸=3ライン PrimitiveType.LineListで描画 とりあえず全体を5倍で描画 private VertexBuffer grid_axis…

C#でツールを作る その6 -3Dポリゴン 描画編-

3D描画のための準備が出来たので、実際に単純な3Dポリゴンを描画してみましょう。 サンプル tool06.zip 3D用頂点配列 3D頂点座標、頂点色、テクスチャ座標 CustomVertex.PositionColoredTextured CustomVertex.PositionColoredTextured[] v = new CustomVert…

C#でツールを作る その5 -3Dポリゴン 準備編-

3D描画のための設定はいろいろ面倒ですねぇ。 3Dを使い始めた頃は何を設定していいのか全然わからなくて、非常に困りました。 少しでも設定が足りないと何も描画されないですからね。エラーとか警告を出してくれれば楽なんですが。。。 デバイス生成時のパラ…

C#でツールを作る その3.1 -ApplicationContextを使ってみる-

前回C#でツールを作る その3-デザインの変更- - while( c++ );のMain()は以下のようになっていますが、 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); using( Hoge hoge = new Hoge() ) …

C#でツールを作る その3-デザインの変更-

ツールっぽいデザインに変更してコントロールに対して描画します。 フォーム Form.spritContainer.Panel1に追加するUserControl。ここに描画します。 実行結果 ソース Hoge.cs アプリケーションクラス using System; using System.Collections.Generic; usin…

C#でツールを作る その2-文字列の描画-

まずは描画の基本、文字列ですね。 実行結果 ソース フォントの作成 文字列の描画 namespace WindowsFormsApplication1 { public partial class Form1 : Form { /*...*/ private Microsoft.DirectX.Direct3D.Font font = null; /*...*/ private void Form1_L…

C#でツールを作る その1-Direct3Dの初期化-

DirectXの解説サイトはたくさんあるのでググって下さい。 とりあえずこことか http://sorceryforce.com/manageddirectx/direct3d_stepup.html VisualC#2008ExpressEditionを使っています。 実行結果 ソース デバイスの初期化、解放 バックバッファの塗りつぶ…

C#で何か作ろうかと。

C++の勉強がちょっと煮詰まってきたので、 気分転換も兼ねてC#で適当にツールでも作ってみようかと。 DirectXはある程度わかるので、3D系のツールを。 MikuMikuDanceとかエルフレイナ的な。 まあ、適当に。 というかC#の知識・技術は無いに等しい(デリゲー…

今気になっているもの。

この半透明なコンボボックス。標準で使うことは出来ないのでしょうか?

Windows Theme API 2-コントロールのテキストを不透明にする-

やっと出来ました。長かった。。。 左の「button1」が正しく描画されている状態です。 手順 1.ボタンのサブクラス化 SetWindowLongPtr 2.ボタンの描画の前に、ペイントバッファを用意 BeginBufferedPaint 3.メモリデバイスコンテキストに描画(デフォルトの…

Windows Theme API

DrawThemeTextExで描画 WTLのソースを見ながら必要な部分だけ自分のプログラムに組み込んでみました。 テキストの周りのglowがいいですねぇ。 背景が黒くても文字が読めますね。 さて、以下ソースです。 1.uxtheme.dllをロードしてtheme APIがサポートされ…

WTLを使ってみる

Aero Glassで黒い文字が透明になってしまう現象を解決できそうです。 Theming API(uxtheme.h) OpenThemeData CloseThemeData DrawThemeTextEx BeginBufferedPaint EndBufferedPaint WTLのAero Glassサンプル まずはWTLを使わずに、Theming APIを直接使って…

Aero Glass2

文字色の問題は原因がわからないので、先にAero GrassAero Glassの方を進めて行きます。クライアント領域を透明化する方法は、とりあえず2種類あるようです。 DwmEnableBlurBehindWindow()で指定したregionを透明化。NULLを指定するとクライアント領域全体 D…

Aero Glass

以下のようにクライアント領域全体を透明化してみましょう。 ただしボタンなどの黒い部分も透明になってしまいます。 C#で試してみる 参考サイト http://msdn.microsoft.com/ja-jp/magazine/cc163435.aspx サンプルをダウンロードして実行すると以下のような…