2017-12-11 13 views
0

私は補間されたサーフェスの例を作成しようとしています。 まず、補間されたトレフォイルの例を作成しました。 enter image description hereGL_PATCHESを渡す方法

ここでは、私のexampleのソースです。 それから、アニメーションが20-30FPSくらい遅いことに気がついた。 いくつかの論文の後で、私は、トレフォイルの評価をGPUに「移動」させなければならないことを知っています。そこで、テッセレーションシェーダについていくつかの論文を勉強しました。

#version 130 
in vec4 Position; 
in vec3 Normal; 

uniform mat4 Projection; 
uniform mat4 Modelview; 
uniform mat3 NormalMatrix; 
uniform vec3 DiffuseMaterial; 

out vec3 EyespaceNormal; 
out vec3 Diffuse; 

void main() 
{ 
    EyespaceNormal = NormalMatrix * Normal; 
    gl_Position = Projection * Modelview * Position; 
    Diffuse = DiffuseMaterial; 
} 

は、今私は、乗算質問している:私はすでにTriangle_Stripsで行ったように私はGL_PATCHESを渡すために、頂点の配列を

  • を使用していますか?私はシェーダ頂点単に次のバインド瞬間 どの方が速いの? DrawElements?

glDrawElements(GL_TRIANGLE_STRIP, Indices.Length, OpenGL.GL_UNSIGNED_SHORT, IntPtr.Zero);

または私はインデックスの配列について

glPatchParameteri(GL_PATCH_VERTICES,16); 
glBegin(GL_PATCHES); 
    glVertex3f(x0,y0,z0) 
    ... 
glEnd(); 
  • 何を使うべきでしょうか?どのようにしてパスの順序を決めることができますか?

  • シェーダの法線も計算しますか?

  • 私は、テッセレーションシェーダの例をいくつか見つけたが#version400 に私は同様のモバイルデバイス上でこのバージョンを使用することはできますか?(のOpenGL ES)

  • 私はマルチスレッドでGPUに複数のパッチを渡すことはできますか?

多くの方々には前もって感謝します。

+0

トレフォイルメッシュデータをCPUに作成せず、頂点バッファと頂点配列オブジェクトを作成します(1回限り)。次に、メッシュを連続して描くことができます。メッシュは、頂点配列オブジェクトに記述されており、最大のパフォーマンスで描画されます。あるいは、メッシュ自体が何らかの形でアニメーション化されていますか(スキニングやモーフィングなど)? – Rabbid76

+1

@ Rabbid76: "OpenGL ESは、ジオメトリシェーダシェーダまたはテッセレーションシェイダを提供していません。 ES 3.2は確かにそうです。 –

+0

@ Rabbid76はい、メッシュ自体もアニメーション化する必要があります。現時点では、VBOとVAOを一度作成しますが、残念なことに、トレフォイルはCPU上のメッシュデータです。したがって、私はGPU上にメッシュデータを作成する予定ですが、最高のパフォーマンス達成のために何を使用するのか分かりません。 – TimDor

答えて

1

本質的には、すべてが合成できるので、インデックス(または頂点)に関してGPUに何かを送る必要はないと思います。三角形の結び目の評価が、双一次パッチの結果としてのテッセレーションされたメッシュの連結性に直接マッピングされるかどうかはわかりませんが、これはうまくいく可能性があります。

各頂点が単一の三つ葉の結び目の位置である単純な頂点バッファで行うことができます。 glPatchParameteri(GL_PATCH_VERTICES、1)を設定します。次に、glDrawArraysを一回呼び出して複数の結び目を描くことができます。

glDrawArrays(GL_PATCHES、0、numKnots);

テッセレーション制御ステージは、単純なパススルーステージにすることができます。その後、テッセレーション評価シェーダで抽象的なパッチタイプの四角形を使用できます。その後、提供された[u、v]座標を使用して、トレフォイルノットの評価、またはその他のバイパラメトリックシェイプをテッセレーション評価シェーダに移動します。次に、すべての三つ葉を入力頂点で変換することができます。法線はシェーダでも計算できます。

または、プリミティブ出力としてプリミティブと三角形ストリップ入力としてだけを使用して一つの入力頂点位置から三つ葉を合成するジオメトリシェーダを使用することができます。それから、もう一度呼び出すことができます

glDrawArrays(GL_POINTS、0、numKnots);

を作成し、ジオメトリシェーダで、インデックスを生成する関数を使用して評価の順序を記述し、生成された頂点を入力頂点で変換することによって、トレフォイルを作成します。

どちらの場合でも、OpenGLで無効な描画呼び出しをマルチスレッドする必要はありません。テッセレーションの場合は64×64、ジオメトリシェーダの場合はGL_MAX_GEOMETRY_OUTPUT_VERTICESにする必要があります。

+0

ご協力ありがとうございます。より多くの論文が完成した後は、複数のベジエパッチに分割されたサーフェスをテッセレーションするために、より簡単な例を見つけたので、テッセレーションシェーダを使用したいと思います。私はちょうどシャープGLまたはOpenTKでglPatchParameteri(GL_PATCH_VERTICES、1)を使用する方法を見つけることができません。私はWPFで開発する必要があるので、それを見つけなければなりません。サーフェスを複数のベジエパッチに分割する方法や良い例が分かりますか? – TimDor

関連する問題