質問者
DirectX SDK(Feb2006)のStencilFunction

質問
-
God.NetのDirectXフォーラムがなくなってしまったので、仕方なく、ここに投稿させていただきます。適切な板があれば、誘導願います。
Managed DirectXで、RenderStateManagerのCounterClockwiseStencilFunctionプロパティの意味、用途などご存知の方教えていただけないでしょうか。
テストプログラムで確認したところ、今までどおりポリゴン(Mesh)を描画するときは、StencilFunctionプロパティで判定されているようです。(Cullモードに関係なく、裏面、表面ともに描画するときはStencilFunctionで判定されている)
表面を描画するときはCounterClockwiseStencilFunctionで判定、裏面を描画するときはStencilFunctionで判定するのかなと思っていたのですが、どうやら違うようです。
CounterClockwiseStencilFunctionは未実装なのか、それとも私の使い方が間違っているのでしょうか。
環境は、WinXP SP2、.Net2005 C# ProEdition、Managed DirectX(Feb2006)、NVIDIA GeForcePCX5900です。
以上、よろしくお願いします。
すべての返信
-
Managed DirectX(Feb2006) をインストールすると、色々なバージョンの Managed DirectX が導入されるかと思います。どのバージョンを使っているかは調べてみた方が良いでしょう。
sasakiss さんからの引用 テストプログラムで確認したところ、今までどおりポリゴン(Mesh)を描画するときは、StencilFunctionプロパティで判定されているようです。(Cullモードに関係なく、裏面、表面ともに描画するときはStencilFunctionで判定されている)
メッシュや Managed DirectX はユーザモードライブラリであって DirectX 本来の機能ではありません。
このようなライブラリはプログラマと DirectX の間に入る形でいくつかの手順を肩代わりしてくれています。
そのため、内部的にデバイス状態を変更してしまったり、予想外のタイミングで動作が行われたりすることがあります。間にライブラリを挟まない状態では、Cullモードもステンシルバッファもそれぞれ動作するはずです。
PIX for Windows などを使えば、描画命令が実行されるタイミングでのデバイス設定をダンプできるので、私ならそちら方面から問題を探ってみるかと思います。
意図する描画を行うためにはデバイス設定全てをきちんと設定する必要があるので、CounterClockwiseStencilFunction や StencilFunction のみに注目して正確な結論を言うのは難しいかなと思っています。
そもそも sasakiss さんのテストプログラムでステンシルバッファがどのように使われているのかどうかすら私には分かりません。sasakiss さんからの引用 CounterClockwiseStencilFunctionは未実装なのか、それとも私の使い方が間違っているのでしょうか。
環境は、WinXP SP2、.Net2005 C# ProEdition、Managed DirectX(Feb2006)、NVIDIA GeForcePCX5900です。
もし .NET 2.0 用の Managed DirectX を使われているのであれば、Feb2006 でもまだ Pre-Release という扱いで、いくつか未実装の部分があったかと思います。
慣れない方が挑戦するにはまだ早いかなと思っています。
自力で問題の切り分けが出来ないうちに手を出すとたぶん大変です。 -
Managed DirectX(Feb2006) です。なのでDirectXは2.0、それ以外のDirectX.Audioなどは、1.0.29です。それより過去のSDKはアンインストール済。ランタイムは分からないです。
Stencilバッファを使って、複数のメッシュの差集合、共通集合を描画する処理を実装しています。
教科書どおりにStencilFunctionを使えばよいので、CounterClockwiseStencilFunctionが正しく動作しなくて困っているわけではありません。
CounterClockwiseStencilFunctionの仕様、どういう処理をするのか機能、概要をご存知の方いらっしゃれば、教えていただけないでしょうか。
>>慣れない方が挑戦するにはまだ早いかなと思っています。
>>自力で問題の切り分けが出来ないうちに手を出すとたぶん大変です。そうなんですか。多少の不具合はどの技術にもありますし、C++でちまちま書く方が大変だったので、誰でもできるようになるC# + ManagedDirectXでの勉強を始めたのですが。
-
sasakiss さんからの引用 CounterClockwiseStencilFunctionの仕様、どういう処理をするのか機能、概要をご存知の方いらっしゃれば、教えていただけないでしょうか。
Managed DirectX の問題と思って CounterClockwiseStencilFunction を調べるよりは、アンマネージの DirectX の仕様と思って D3DRS_CCW_STENCILFUNC について調べてみる方が情報を集めやすいかもしれません。
sasakiss さんからの引用 そうなんですか。多少の不具合はどの技術にもありますし、C++でちまちま書く方が大変だったので、誰でもできるようになるC# + ManagedDirectXでの勉強を始めたのですが。
DirectX は本質的にちまちまと書かないといけない部分があって、むしろ細かく制御できるという DirectX のメリットそのものかもしれません。
その本質的な「ちまちま感」は、言語を変えても少なからず残るだろうと思っています。
それが壁になりやすいために、私自身は「C# + ManagedDirectX が万人向け」とはあまり感じなかったりします。 -
ヒントをありがとうございます。
D3DRS_CCW_STENCILFUNC で検索したところ、すぐに見つかりました。http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/graphics/programmingguide/advancedtopics/twosidedstencil.asp
一度に両面描画(CullMode=None)したときに、裏面と表面とでStencil処理(比較、操作)を分けることができるようです。
この機能を使うためには、RenderStateのTwoSidedStencilModeをTrueに設定する必要がありました。(これを私が知らなかったために両面Stenciが機能しなかった)
ただし、StencilMask、StencilWriteMask、Stencil参照値は、表面、裏面ごとに異なる値を設定することができない。(このために私はまだ利用できていない)
主な用途は、Stencilシャドウです。StencilBufferの値を表面はインクリメント、裏面はデクリメントするようStencilオペレーションを設定しておくことで、描画回数を削減できる。(いままでは、表面のみ描画後、Stencilオペレーションを変更しなおして裏面を描画していたが、両面StencilによりCullMode=Noneで1回の描画で可能となった。)
勉強になりました。ありがとうございました。