タグ付けされた質問 「geometry-shader」

1
ハル、ドメイン、ジオメトリシェーダーは何に使用されますか?
私は(元)雇用主のために3Dゲームプログラミングの公平な分配を行いました。また、独自のインディーゲーム用に独自のカスタムエンジンでプログラミングを行いました。 最初は、Direct3D 9とD3DX9から始めました。これらはほとんどすべてを行い、シェーダーの観点から考える必要はまったくありませんでした。 その後、最初のDirect3D 9シェーダーを作成しましたが、ほとんどすべてを1つの非常にシンプルなシェーダーで使用しました。 ゲームエンジンの最新の反復では、Direct3D 11に移行し、それによって多くのシェーダーを作成しました。GPUスキニング、GPU計算パーティクル、多くの照明効果、後処理効果をすべてGPUで行いました。本当にクールなもの。 これまでのところ、頂点シェーダーとピクセル/フラグメントシェーダーのみを使用しました。まだ行っていないことはまだたくさんありますが、頂点シェーダーとピクセル/フラグメントシェーダーが何をするのか、それが3Dパイプライン全体にどのように適合するのかについて確かな知識があると思います。 最近の開発に追いついて、新しいシェーダーステージに非常に興味を持ちました。つまり、ジオメトリシェーダー、さらに新しいハルシェーダーとドメインシェーダーです。 私はこれらのステージを使用したことはありませんが、知っていることから、Geometryシェーダーは、有効になっている場合、頂点シェーダーの後に実行され、変換された各頂点に1回(またはプリミティブごとに1回)、頂点(およびプリミティブ?)を破棄できます、新しいものを作成します(パイプラインの最初に戻ると思いますか?)。 私の推測では、ジオメトリシェーダーの主な用途は、GPUでジオメトリをプログラムで生成することです。一般的な使用法は、単一の頂点に基づいてビルボードクワッドを作成することですが、フラクタルや100%プログラムで生成できる他のものを除いて、他の多くの一般的なシナリオを実際に視覚化しません。 ハルシェーダーとドメインシェーダーについては、テッセレーション(粗い表面からより滑らかな表面を作成する?)に関連しているようで、一緒に使用する必要があるか、まったく使用しない必要があります。ここでは「パッチ」という用語も一般的なようです。 これらの新しいシェーダーステージの目的、3Dパイプラインにどのように適合するか、どのような場合にそれらを使用することを検討する必要があるのか​​、実際の用語で誰かに説明してもらえますか?

2
可変線幅のトゥーン/セルシェーディング?
私はセルシェーディングを行うためにそこにいくつかの広範なアプローチを見ています: 法線が反転したモデルの複製と拡大(私にとってはオプションではありません) エッジ検出へのSobelフィルター/フラグメントシェーダーアプローチ エッジ検出へのステンシルバッファアプローチ 面とエッジの法線を計算するジオメトリ(または頂点)シェーダーアプローチ たとえば、ジオメトリ中心のアプローチが照明や線の太さを最大限に制御できると仮定するのは正しいでしょうか。丘のシルエットラインが徐々に平野に合流するのを見るかもしれない地形のために? 地形の表面にピクセル照明が必要ない場合はどうすればよいですか?(そして、セルベースの頂点ベースまたはテクスチャマップベースのライティング/シャドウイングを使用する予定ではないでしょう。)それから、ジオメトリタイプのアプローチを続けるか、代わりにスクリーンスペース/フラグメントアプローチを使用する方が良いでしょうか物事をシンプルに保つために?もしそうなら、メッシュ全体のアウトラインだけではなく、メッシュシルエット内の丘の「インク」をどのように取得し ますか(そのアウトライン内に「インク」の詳細はありませんか?(示唆的な輪郭、折り目))。 最後に、ジオメトリシェーダーを使用して、反転法線アプローチを安価にエミュレートすることは可能ですか?これに関する私の懸念は、すべての頂点を確実に複製し、それに応じてスケーリングできることですが、法線の反転やフラグメントシェーダーの明確な色付けにどのようにアプローチするのでしょうか? 私が欲しいもの-シルエット内の邪魔な線で線の太さを変える... 欲しくないもの... 編集:さらなる研究により、次のことが明らかになりました... 私は地形に大量の頂点を持っているため、距離ベースのLoDを考慮しても、すべての複製とスケーリングに伴う計算の複雑さのために、フリップされた法線もジオメトリシェーダーベースのアプローチも(錐台カリングを使用しても)賢明なオプションになりますアップロードされた頂点。 テレインサーフェス上でソリッドトーンシェーディングの形でピクセル単位のライティングを必要としないことを考慮すると、これらのように、フェース法線ベースのアプローチ(そうでない場合は正しいサーフェスライティングの要件)を検討することも賢明ではなくなります計算するのは当然非常に高価です。しかし、それらが最高レベルの制御を提供することは事実です。たとえば、「芸術的な」ストロークを使用してエッジをシェーディングする機能:美しいですが、非常に複雑なゲーム環境では実際には実行できません。 ステンシルバッファーは、シェーダーですべての作業を行うことを好むため、避けたいものです。(上記の赤いアウトラインの例は、ステンシルバッファーで行われました-古い学校です。) これにより、フラグメントシェーダーのイメージ空間アプローチが残ります。計算の複雑さは、頂点の数ではなくフラグメントの数に削減されます(私の場合、これはジオメトリシェーダーで行う必要がある操作よりも10〜100倍少ない操作です)。これには、不連続フィルター(Sobel演算子など)を適用できるgバッファー(通常バッファーとオプションで深度バッファーで構成される)を生成するために、複数のレンダーパスが必要です。深さの不連続性は、示唆的な輪郭と折り目を可能にします。このアプローチの私の唯一の問題は、インクエッジの幅をより細かく制御できないことですが、フラグメントシェーダーの適切なアルゴリズムを使用すれば、これが可能になると確信しています。 質問はより具体的になりました:フラグメントシェーダーで、特に外側のシルエットで、可変エッジ幅をどのように正確に取得するのですか?

5
Vector3で演算子 '> ='を使用できないのはなぜですか?
私は私がように参照する2つの位置の間を移動するための四角形を取得しようとしている_positionAとします_positionB。どちらもタイプVector3です。長方形はうまく動きます。ただし、到達_positionBしても、本来のように反対方向に移動することはありません。 コードをもう一度見てみました。オブジェクトが移動ifすると、コード内のステートメントは、rectsの位置がに等しいフレームを逃したという結論に達しました_positionB。rectsの位置がより大きいか等しい 場合は、コードを変更して方向を逆にすることにしました_positionB。私のコードは長すぎないので、以下に表示します。 using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

1
OpenGLで頂点を描画する最も効率的な方法
私はOpenGL 3Dゲームを書いています。地形や使用中のオブジェクト用の多数の三角形があります。 私はOpenGL公式ガイドから勉強していて、最初に提示された方法は、描画したい各頂点のglVertex後に関数を呼び出すglBeginことです。 ただし、何千もの三角形を描く必要がある場合、この方法はかなり古くて非効率的です。各フレームで変化しない情報をグラフィックカードのメモリに保存する方法があるので、各フレームをレンダリングすると、その情報はすでにそこにあります。より「不安定な」情報については、おそらくフレームごとに新しい頂点データを送信する必要があるため、別の手法の方が効率的かもしれません。 私の質問に来ます:頂点情報をハードウェアに送信し、レンダリングするための指示を与えるために使用される最も近代的で効率的なOpenGL関数と技術の明確な説明をお願いします。 フレーム中にめったに変化しない頂点データをレンダリングするための順序を送信するための最良の方法とOpenGLツールは何ですか(私は地形とオブジェクトについて考えます)、フレーム中に大きく変化する頂点データを送信するための最良の方法は何ですか?

2
複数のプリミティブのジオメトリシェーダー
複数のプリミティブを処理できるジオメトリシェーダーを作成するにはどうすればよいですか?たとえば、三角形のジオメトリシェーダーを作成するときは、次のようにレイアウトを定義します。 layout(triangles) in; layout(triangle_strip, max_vertices=3) out; しかし、このシェーダーを使用すると、線や点が表示されません。だから追加: layout(triangles) in; layout(triangle_strip, max_vertices=3) out; layout(lines) in; layout(line_strip, max_vertices=2) out; シェーダーはコンパイルして実行しますが、ライン(または最後に定義されたプリミティブが何であれ)のみをレンダリングします。 それでは、複数のタイプのプリミティブを処理する単一のジオメトリシェーダーをどのように定義しますか?またはそれは不可能であり、各タイプを描画する前に複数のシェーダープログラムを作成してシェーダープログラムを変更する必要がありますか
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.