2012-01-18 10 views
5

私はUnityでワイヤフレーム頂点/フラグメントシェーダを作成しようとしています。 this paperによると思われます。一般的なアイデアは、頂点シェーダで計算された距離ベクトルをフラグメントシェーダの各フラグメントに渡し、ポリゴン内の位置に基づいてワイヤフレームラインを描くためにどのような輝度を決定するのに使用できるかのようです。頂点シェーダ内のポリゴン内のすべての頂点にアクセスできますか?

私が読んだこと以外は、頂点シェーダの単一の頂点にしかアクセスできないと思われます。私はecah頂点のためにポリゴン内の隣接する頂点のすべてにアクセスする必要があります。この論文はジオメトリシェーダが必要ないことを暗示しているようですが、これはUnityがそれらをまだサポートしていないためです。

私には何が欠けていますか?頂点シェーダの隣接する頂点にアクセスすることはできませんか?私がしようとしていることはジオメトリシェーダなしでは不可能なのでしょうか?

答えて

2

あなたは確かに

ステップG1は、一般的に、常に頂点シェーダで実行されると言う2.1で過読み段落を持っているようです。ジオメトリシェーダ は、ポリゴンのすべての頂点にアクセスできるため(三角形の場合)、ステップG2 をジオメトリシェーダで実行する必要があります。 したがって、ジオメトリシェーダが使用されていない場合、頂点シェーダ は、距離として を計算するために、他の頂点を属性として受け取る必要があります。これは、ワイヤフレーム法が使用されているかどうか、追加データは に送信する必要があるかどうか、そして最後に、頂点の属性がどの三角形に依存するためにインデックス付きプリミティブを使用するのが排除されているのかをアプリケーションコードが が描画されます。

したがって、ジオメトリシェーダを使用しないときは、実際には三角形の他の頂点を知らないため、追加の頂点属性としてそれらを送信する必要があります。したがって、三角形の各頂点には、この三角形の他の2つの頂点の位置を含む2つの追加のvec3属性があります。もちろん、これらの2つの属性は頂点の位置に依存するだけでなく、この頂点が属する三角形にも依存するため、テキストのように、インデックス付きの図面は使用できません。

+0

ご協力いただきありがとうございます。これらの制約がUnityエンジン内で克服できるものかどうかは分かりますか? Unityが使うようなCgシェーダでこの余分な情報を渡すことは可能ですか?その通過はどこから行なわれますか? – aardvarkk

+0

@aardvarkkこれらの制約は、基本的なハードウェア/インタフェースの制約であり、エンジンやシェーディング言語ではないため、克服することはできません。頂点シェーダは単一の頂点にしかアクセスできず、他の2つをこの頂点の属性として与える必要があります。ユニティの経験はありませんが、もちろんCgには頂点ごとの属性があります。Unityには、モデルの頂点のカスタム属性を与える手段があると確信しています。 –

+0

@aardvarkk元の質問についてさらに質問がありますか(VSの隣人にアクセスでき、GSなしであなたの目標が不可能な場合)?頂点シェーダーとジオメトリシェーダーを理解している人とは全く異なる答えは得られません。 Unityは、基本的なグラフィックスハードウェアの限界を魔法の克服することはできないので、それと関係はありません。 –