OpenGLのプログラミングガイド(8)

1、細分シェーダ(テッセレーションシェーダ)ジオメトリグリッドのモデルを生成するための2つの段階があります。

 1)すべてのグリッドセグメントを設定する段階を遮光頂点は、新しいターゲット・プリミティブを生成するために、頂点の順序付きリストを使用して、プロセスを三角形。

 2)新たに生成されたプリミティブの頂点が次のステージに指定された場所に置きました。

 

頂点のリストである新しいパッチ(パッチ)と呼ばれる2、テッセレーションシェーダの処理エレメントは、所望の配列を確保します。描画コマンド処理表面シートのサイズが同じであるとパッチの頂点の数は、それ自身を設定する必要があります。

  0とGL_MAX_PATCH_VERTICESの間になるように、ボイドglPathcParameteri(GLenum pnameの、輝き値)// PNAME必見のGL_PATCH_VERTICES、値、自分のニーズを

  パッチ3のため、以下、この値よりも頂点のデフォルト数は、プロセスが任意のジオメトリを生成しません無視されます。GL_PATCHESにパッチ、描画コマンド入力タイプを設定するには、次の例を示します。

  フロート頂点[] [2] =  { {-0.75、0.25}、{0.5、0.5}、{0.55、0.53}、{-0.5、0.55} }。

  glBindVertexArray(VAO)。

  glBindBuffer(GL_ARRAY_BUFFER、VBO)。

  glBufferData(GL_ARRAY_BUFFER、はsizeof(頂点)、頂点、GL_STATIC_DRAW)。

  glVertexAttribPointer(0、2、GL_FLOAT、GL_FALSE、0 nullptr)。

  glEnableVertexAttribArray(0)。

  glPatchParameteri(GL_PATCH_VERTICES、4)。

  glDrawArrays(GL_PATCHES、0、4)。

  テッセレーションシェーダ頂点データを用いて得られたgl_in、長gl_PatchVerticesIn利用可能gl_inは、gl_PatchVerticesOutシート生地出力の頂点の数です。

 

図3に示すように、細分割制御シェーダ(オプションのステップ)

 1)表面シートのすべての頂点の属性値を更新しながら計算gl_outシェーダにセグメントに格納され、転送された出力パッチの頂点の分割を生成します

 2)暗黙宣言gl_TessLevelOuterとプリミティブの制御動作、gl_TessLevelInnerを生成するために詳細なレベルの因子を設定します

 

図4は、レイアウト数量詞パッチの頂点によって提供される出力は、gl_InvocationIDは出力電流の頂点は、いくつかの、すなわちgl_out指標の最初であることを示します。

  アウトレイアウト(頂点= 4); //セット4を同時に(出力ごとに一度実行頂点)シェーダの実行回数を表すシート出力点の頂面の数

  #version 420コア

  レイアウト(頂点= 4)のうち。

  無効メイン()

  {

    gl_TessLevelOuter [0] = 2.0。

    gl_TessLevelOuter [1] = 3.0。

    gl_TessLevelOuter [2] = 2.0。

    gl_TessLevelOuter [3] = 5.0。

    gl_TessLevelInner [0] = 3.0。

    gl_TessLevelInner [1] = 4.0。

    gl_out [gl_InvocationID] .gl_Position = gl_in [gl_InvocationID] .gl_Position。

    // ......

  }

 

図5は、内側セグメントの合計量と共同決定(境界領域細分化を制御する責任gl_TessLevelOuter、四つの要素の配列の長さ)の外側(gl_TessLevelInner、素子アレイ2の長さは、内部サブディビジョンは、制御モードの原因です)。それらの値は、設定値が1未満またはNaN、パッチが処理されずに破棄されているアプリケーションで上記の例のように書くことができる制御セグメントに書き込まれたシェーダであってもよいです。

  ボイドglPatchParameterfv(GLenum PNAME、CONST GLfloat *値)// PNAME相当GL_PATCH_DEFAULT_OUTER_LEVEL、GL_PATCH_DEFAULT_INNER_LEVEL、値が対応する設定値の配列に

 

線分方法6、三種類

 1)equal_spacing

 

 

 2)fractional_even_spacing

 

 3)fractional_odd_spacing

 

 

 

図7は、OpenGLは三つのセグメントに細分化ドメインをサポート:四角形、三角形、輪郭のセット。

 1)A四角形細分化フィールド:(u、v)は2次元座標を用いて、すべての値gl_TessLevelOuter gl_TessLevelInner、パッチの細分割の座標を使用します。次のように4内訳に記載されたパラメータの説明図です。

 

 しかし、私はこのようになります塗装(gl_TessLevelInner [0]とgl_TessLevelInnerの上にラベルを[1]の位置を入れ替える必要があります)

 

 

 

 2)輪郭セグメントドメイン:gl_TessLevelOuter前に2つの値を使用。二つの面は、シートの一方のエッジを共有する場合を考えると、最初の行は表示されません。

 3)トライアングル細分ドメイン:最初の値gl_TessLevelOuter gl_TessLevelInnerの最初の3つの値を使用して。セグメントは、個々の成分は範囲について、表す重心座標(x、y、z)の中心を座標系[0.0、1.0] Z + Y + X = 1.0つつ。

 

 

8、细分计算着色器:细分生成的顶点都要执行一次细分计算着色器将细分坐标转换为下文能够识别的屏幕坐标。细分计算着色器首先设置图元生成器,通过layout设置细分域、图元类型(quads、triangles、isolines)、图元面朝向(cw、ccw)、生成方式,然后根据前面的参数计算出需要的坐标等信息。

  layout (quads, equal_spacing, ccw, points) out;//这些参数的顺序不是严格的

  #version 420 core

  layout (quads, equal_spacing, ccw) in;

  void main()

  {

    float u = gl_TessCoord.x;

    float v = gl_TessCoord.y;

    float mu = 1.0 - u;

    float mv = 1.0 - v;

    gl_Position = mu*mv*gl_in[0].gl_Position + u*mv*gl_in[1].gl_Position + u*v*gl_in[2].gl_Position + mu*v*gl_in[3].gl_Position;

  }

 

10、https://www.khronos.org/opengl/wiki/Tessellation

 

おすすめ

転載: www.cnblogs.com/haihuahuang/p/12423868.html