2017-10-12 1 views
4

OpenGLでNurbsSurfaceを作成したいと思います。私は40×48のコントロールポイントサイズのグリッドを使用します。また、頂点の順序を決定するためにインデックスを作成します。私は三角形の私の表面を作成した。このようにNurbsSurfaceの理解

enter image description here

。 誤解を避けるためです。私は持っています float[] vertices=x1,y1,z1,x2,y2,z2,x3,y3,z3.......float[] indices= 1,6,2,7,3,8.... 今私は三角形を描きたくありません。私はサーフェスポイントを補間したいと思います。私はnurbsやB-Splinesについて考えました。

手がかりは: Nurbsアルゴリズムを決定するために、パッチごとにパッチを補間する必要があります。私の理解では、1つのパッチは、たとえば、ポイント1,6,2,7または2,7,3,8として定義されています(画像を開いてください)。

まず、頂点シェーダを使用するために頂点とインデックスを作成しました。 しかし、実際にはそれを古い方法で描くだけで十分でしょう。この場合、以下のようにIは、頂点及びインデックスを決定するであろう:

float[] vertices= v1,v2,v3... with v=x,y,z 

とOpenGLで

float[] indices= 1,6,2,7,3,8.... 

は、使用する準備ができたNurbs機能があります。 glNewNurbsRenderer。だから私はパッチを簡単にレンダリングすることができます。 残念ながら、私はその時点でパッチを一緒に縫い合わせる方法に失敗します。私は説明を見つけたTeapot example(多分私はこれに執着するようになった)私は私のケースに解決策を転送することはできません。手伝ってくれますか?

答えて

3

サーフェスを描画するコントロールポイントのセットがあります。

あなたが提供しているティーポットの例のリンクに記載されている。この

  1. 取り掛かることができる2つの方法があります。 コントロールポイントから頂点を計算し、トポロジとしてGL_TRIANGLEを持つグラフィック パイプラインを渡します。グラフィックスハードウェア は描画するために三角形分割されたデータが必要です。 制御点 http://www.glprogramming.com/red/chapter12.html

  2. あなたはあなたのコントロールポイントのパスを用意して 三角測量するテッセレーションシェーダを使用して、これらのポイントをステッチすることができますから、頂点を評価する方法を示し、このリンクに従ってください。

    このためには、コントロールポイントのセットをパッチ使用GL_PATCHプリミティブ として用意し、それをテッセレーションコントロールシェーダに渡します。この中で、あなたが望むテッセレーションレベルを と指定します。それに応じて、パッチは にプリミティブジェネレータと呼ばれる別の固定機能ステージでテッセレーションされます。 生成された頂点は細かく調整できるテッセレーション評価シェーダ に渡されます。ここでは、外側または内側のテッセレーション レベルを指定して、パッチをさらに細分化することができます。

    VBOとIBOをコントロールポイントと同じように配置し、描画時にGL_PATCHプリミティブを使用することをお勧めします。テッセレーションシェーダを使用してnurbサーフェスを描画する方法については、以下のチュートリアルに従ってください。

注:私が示唆している第2の方法は、トリッキーなものであり、多くの研究論文を読む必要があります。あなたは、私はオプション1

+0

オーケーで行くことをお勧め近代的なパイプラインと一緒に行きたいいけない場合

は、私が思うに、私は頂点とコントロールポイントを混同と信じています。三角形をグラフィックスパイプラインに送信した後、どのようにしてglNurbssurfaceを使用する必要がありますか? nurbsコマンドに従って、すべてのコントロールポイントを浮動小数点として与えますか?私はジオメトリシェーダのコードhttp://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.95.9155&rep=rep1&type=pdfを見つけただけでなく、これも使用できますか?私が理解したように、グラフィックスパイプライン内で、ジオメトリシェーダは頂点シェーダの直後にあります – TimDor

+0

オプション1で述べたように、gluNurbSurface機能を使用できます。また、コントロールポイントから頂点の位置を計算する方法も示しています。頂点位置を取得したら、VBOで塗りつぶして、GL_TRIANGLEを使って通常の描画を行います。 –

+0

はい、ジオメトリシェーダを使用することもできます。しかし、ジオメトリシェーダは、入力アセンブリステージがジオメトリシェーダの前後で実行されなければならないため、パフォーマンスにとって非常に悪いことに注意してください。ジオメトリシェーダは実際にテッセレーションシェーダの後に来ますが、それらを使用していない場合はジオメトリシェーダは頂点シェーダの後にあります。 –