1

cocos2d-x 2.0.4 で作業しています。この 2 つの画像を通して、私が何をしようとしているのかを説明します。

凸面ポリゴン 凸状のポリゴンを持つ境界線

私がやりたいことは、ぼやけた境界線またはグラデーションのある境界線をプログラムで作成することです。それを行うには2つのアイデアがありますが、それが正しい方法かどうかはわかりません。最初の解決策は、ぼやけた色のみを含む多角形 (この場合は穴のある凹型多角形) を三角測量し、その上にグラデーションで色をレンダリングすることです。多角形の外側の頂点はフル アルファになり、内側の頂点はゼロになります。 -アルファ。その場合、補間は勾配の仕事をします。2 番目の解決策は、シェーダー自体の内部で実行することです。必要なのは、ピクセルとそれに最も近いポリゴンのエッジからの距離を計算することだけです。次に、特定のしきい値の下で、その距離に応じて特定のアルファ値でピクセルの白色に影響を与えます (距離が最短であるほど、アルファは最大になります)。

とにかく、私はopenGLのものに非常に慣れていないため、ポリゴンのすべてのピクセルの距離を計算する必要があるため、2番目のソリューションでは処理時間が長くなってしまうのではないかと心配しています. この人たちについてどう思いますか?私の推測を確認する傾向があるアイデアはありますか、それとも私はこれについて完全に間違っていますか?

編集:私が最終的に選択した解決策は、ポリゴン内のすべての角度の二等分線 (3 つの連続した頂点で計算しやすい) を使用し、その二等分線上のポイントを取得して、内側のポリゴンの頂点にすることでした。次に、外側のポリゴンの頂点または内側のポリゴンの頂点を取得して、GL_TRIANGLE_STRIP パラメーターに適合する頂点の配列を作成します。分かりやすいように下に画像を貼っておきます。

説明

4

2 に答える 2

2

リム ライティング シェーダは、あなたが望むことをしますか? 例へのリンク

GLSL リム ライティング シェーダのコード例:

const float rimStart = 0.5f;
const float rimEnd = 1.0f;
const float rimMultiplier = 0.0f;
vec3  rimColor = vec3(1.0f, 1.0f, 1.0f);

float NormalToCam = 1.0 - dot(normalize(outNormal), normalize(camPos - vertexWorldPos.xyz));
float rim = smoothstep(rimStart, rimEnd, NormalToCam) * rimMultiplier;

outColor.rgb += (rimColor * rim);
于 2013-02-26T18:21:02.677 に答える
1

3Dシーンのどの視点からでもこれを正しく表示するには、シルエットを実行する必要があります。これには、基本的に、ジオメトリシェーダーを使用して、画面に面している隣接面と画面に面していない隣接面を持つオブジェクトのエッジを決定することが含まれます。これは、一方の隣接する面の法線とカメラの方向の間の内積が<= 0であり、もう一方の隣接する面の法線とカメラの方向の間の内積が>0であるかどうかをテストすることで達成できると思います。

特定の角度でポリゴンの輪郭を描くすべてのエッジがわかったら、その境界で定義されたポリゴンを三角ストリップにテッセレーションできます(ジオメトリシェーダーにあります)。次に、頂点ごとの色をフラグメントシェーダーに渡します。ここで、境界にあるすべての頂点は完全なアルファで境界色を通過し、非境界点はゼロアルファで色を通過します。フラグメントシェーダーは、中間フラグメントで境界線の色から中央のアルファ色に補間し、必要なグラデーションを提供します。全体的なアプローチは次のようになります。

  1. 非境界シェーダープログラムを背景色としてオブジェクトを描画します。
  2. アルファブレンディングを有効にします。

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
    
  3. 境界線の色で境界線を構成するエッジを決定し、境界線以外の点をゼロアルファとして描画するシルエットプログラムを使用してオブジェクトを描画します。

  4. glDisable(GL_BLEND);
    
于 2013-02-26T17:51:21.570 に答える