2017-01-01 14 views
4

基本的には、キューブの周りにアウトラインを描きたいと思います。ステンシルとSCNTechniqueの使い方

  1. 通常のキューブをレンダリングし、また、ステンシルバッファにその占有する画素を記述します。これを行うには、私は次のレンダーパスを持っているSCNTechniqueを使用することができると思います
  2. 最初のパスでステンシルと交差しない場合は、少し大きめのキューブをレンダリングします。

ステンシルのドキュメントはSCNTechniqueで非常に疎であり、使用方法は正確にはわかりません。

デプステストを無効にして最初に大きな「アウトラインキューブ」を描画し、その後に通常のキューブを描画することで、輪郭を描くことに成功しました。これはかなりうまくいきますが、代わりに他の複雑さのためにステンシルを使用したいこの方法で。

それはステンシルバッファを使用して動作するように取得しようとする試みでは、私の最初のパスのstencilStatesのような(私は性質が必要だと思う理由と一緒に)なります

clear = YES // To clear the buffer from last 
enable = YES // To write to the buffer 
behavior: 
    writeMask = 1  // Use bit 1 
    function = always // Always write to stencil regardless? 

状の第2のパスのstencilStatesルックス:

clear = NO // Keep the buffer from last step 
enable = NO // Don't write to the buffer (only read?) 
behavior: 
    readMask = 1  // Use bit 1 
    fail  = keep // Not sure if these... 
    pass  = zero // ...should be the other way round 

ステンシルバッファの動作にはかなりのものがありますが、必要なものと使い方がわかりません。ステンシルバッファを各パスの入力または出力としてリストする必要があるかどうかもわかりません。

編集1:ここだ正確私が最初に深度バッファに書き込むことなく、青、大きなアウトラインキューブを描画することにより、レンダリング、実装しているよ何を:それはwasn場合

Cube with blue outline

このような実装を残しておきたいと思いますが、代わりにステンシルのアプローチがこれらの副作用を避けると思っています。とにかくそれらを使用する方法を知っておくと便利だと思います!

編集2:私は、OpenGL(C言語)を使って同様の効果を出そうとしています。私はステンシルの仕組みを完全に理解しているふりをしていません(そして、私は基本的にcode from a tutorialを借りてきました)。しかし、これらのコマンドは私が達成しようとしているものを作り出しています。主なキューブを描画する前に

、ステンシルバッファへの書き込み:メインキューブを描画した後

glStencilFunc(GL_ALWAYS, 1, 0xFF); // Set any stencil to 1 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
glStencilMask(0xFF); // Write to stencil buffer 
glClear(GL_STENCIL_BUFFER_BIT); // Clear stencil buffer (0 by default) 

、より大きなアウトラインキューブを描画する前に、現在のステンシルバッファをテスト:

glStencilFunc(GL_EQUAL, 0, 0xFF); // Pass test if stencil value is 0 
glStencilMask(0x00); // Don't write anything to stencil buffer 

したがって、問題はSCNTechniqueを使用して上記を達成する方法です。

+0

申し訳ありませんが、視覚的な質問をしていますが、あなたが探しているアウトラインエフェクトのタイプの画像/ショットを表示することはできますか?あなたが好きなもの/欲しいもの/欲しいものが見つかるまで、キューブや輪郭や漫画の効果についてのキーワードを使ってGoogle画像を表示してください。 – Confused

+0

@Confused確かに、私は達成しようとしているもののレンダリングを編集しましたが(しかし、ステンシルを使って)。見ていただきありがとうございます! – Robert

+0

私は、OpenGLがどのようにそれらについて説明しているのかを読み解くことで、ステンシルバッファを見てきました。私は彼らがこのための正しいツールであるとは確信していません。彼らはマスキングをしているので使用することができますが、逆転マスキングの場合も同様です。白いダイスはその周りの青いボックスで行うことができます。私の腸の感覚(とそれで素朴な腸)は、どこかにダイスの周りがダイスの周りのこのタイプのより良い、より滑らかな輪郭を描くことができることを知っているピクセルシェーダーです。しかし、私はそれをどうやって行うのか、それがSceneKitでも可能であるかどうかわかりません。 – Confused

答えて

0

SCNテクニックを使用してアウトラインを描くことができます。このアイデアは、オブジェクトマスクをバッファに描画し、マスクの1つのチャネルをぼかし、元のレンダリングされたフレームと結合することです。そのコンビネーションシェーダは、ぼやけたチャンネルをチェックし、ぼかしされていないチャンネルだけをチェックして、オブジェクトの外にアウトラインをレンダリングします。

ノードの周りにグローを描く例があります:https://github.com/laanlabs/SCNTechniqueGlow あなたが望む効果を得るには、それを変更できるはずです。

関連する問題