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

シェーダー、つまりGPUパイプラインのプログラム可能な部分に関連するすべての質問。言語固有のシェーダーの質問については、[glsl]および[hlsl]タグも参照してください。

1
フラグメントシェーダーでこれが非常に遅いのはなぜですか?
私はいくつかのFPS測定コードをWebGLでセットアップしました(このSO回答に基づいて)、フラグメントシェーダーのパフォーマンスに奇妙な点を発見しました。このコードは、1024x1024のキャンバス上に単一のクワッド(または2つの三角形)をレンダリングするだけなので、すべての魔法はフラグメントシェーダーで発生します。 このシンプルなシェーダー(GLSL。頂点シェーダーは単なるパススルーです)を検討してください。 // some definitions void main() { float seed = uSeed; float x = vPos.x; float y = vPos.y; float value = 1.0; // Nothing to see here... gl_FragColor = vec4(value, value, value, 1.0); } したがって、これは白いキャンバスをレンダリングするだけです。私のマシンでは平均で約30 fpsです。 それでは、数値演算を増やし、数オクターブの位置依存ノイズに基づいて各フラグメントを計算しましょう。 void main() { float seed = uSeed; float x = vPos.x; …

1
一定の条件はシェーダーの切り替えよりもコストがかかりますか?
一般的に、シェーダーでの分岐は良いアイデアではありません。しかし今では、描画呼び出し全体に対して一定の条件を持つシェーダーがあります。したがって、実行されるブランチは、1つの描画呼び出しに対して常に同じです。 そのような種類の分岐は、これらの分岐なしで複数のシェーダーを持ち、それらを切り替えるよりもまだ高価ですか?


2
導関数マップと接線空間法線マップ
一部のエンジンが接線空間法線マップの代わりに微分マップを使用していることを発見しました。 いくつか読んだ後、それは接線空間法線を置き換えるための本当に素晴らしい方法のようですが、それらを使用するいくつかの欠点がありますか?なぜ接線空間法線を使い続けるのですか? メリットとデメリットの両方を比較することは可能ですか?

1
シェーダーのループパフォーマンス
動的ループ関数をシェーダーに統合するための最良の方法は何ですか? まず、動的配列は不可能であるようです。では、最大サイズの配列を作成し、その一部のみを埋めるか、定義済みのサイズで配列を定義する方が良いでしょうか? 次に、この配列を反復処理する最良の方法は何ですか? 4〜128回の反復で、展開されたループまたは動的ループを使用する方が良いですか。また、事前定義された最大反復回数まで展開してから、などの条件で停止できることも確認しましたif (i == myCurrentMaximumIterationNumber)。


1
シェーダープログラムを変更するときに、ユニフォームまたは属性を再バインドする必要がありますか?
シーンのレンダリングには通常、複数のシェーダープログラムが含まれます。私の場合、すべてが同じ属性を使用し、少なくともいくつかのユニフォームを共有しています。それらを適切に機能させるために、私は現在安全にプレイしています。つまり、シェーダープログラムを切り替えるたびに属性を再バインドし、適切な均一の場所を取得しています。したがって、基本的に各フレームで複数回実行することは、おそらく最善の方法ではありません。 では、シェーダープログラムを切り替えた後、(一般的に)属性とユニフォームを再バインドする必要がありますか?なぜ? もしそうなら、これをプログラムの開始時に一度行い、再びそれらに触れる必要がない方法はありますか?
11 opengl  glsl  shader 


1
多くの光源を使用した効率的なレンダリング
フォンシェーディングを使用して単一の光源でシーンをレンダリングするには、マテリアルと光源の両方のアンビエント/拡散/鏡面反射光コンポーネントに基づいて、フラグメントシェーダーに渡される各フラグメントの最終的な色を計算できます。 これは、個々の光源をフラグメントに適用した結果を次のように追加することで、複数の光源に対応するように簡単に拡張できます。 final_color = (0, 0, 0, 1) for each light: final_color += apply_light(material, light) final_color = clamp(final_color, (0,0,0,1), (1,1,1,1)) ただし、光源の数が非常に多い場合、このプロセスは非常に遅くなります。でN点灯し、このアプローチが行われるシェーディングフォンのための計算が必要ですNフラグメントあたりの回。 非常に多数の光源(数百、数千など)でシーンをレンダリングするためのより良いアプローチはありますか?

2
にきびの原因
シャドウマッピングのしくみはわかっていますが、シャドウニキビの原因がわかりません。誰でも簡単にシャドウニキビの原因を教えてもらえますか?それはデプスマップの解像度とどのように関連していますか?

1
GGXジオメトリ用語の正しい形式
レイトレーサーにマイクロファセットBRDFを実装しようとしていますが、いくつかの問題が発生しています。私が読んだ多くの論文や記事は、ビューと半ベクトルの関数として部分幾何学用語を定義しています:G1(v、h)。しかし、これを実装すると、次の結果が得られました。 (一番下の列は1.0〜0.0の粗さの誘電体、一番上の列は1.0〜0.0の粗さの金属です) エッジの周りに奇妙なハイライトがあり、nl == 0の周りにカットオフがあります。これがどこから来ているのか本当にわかりませんでした。レンダーを確認するための参照としてUnityを使用しているので、シェーダーソースをチェックして、何が使用されているかを確認し、ジオメトリ用語が半ベクトルによってパラメーター化されていないことを確認できます!だから私は同じコードを試しましたが、半分のベクトルの代わりに表面の法線をマクロに使用し、次の結果を得ました: 私の訓練されていない目には、これは望ましい結果に非常に近いようです。しかし、私はこれが正しくないと感じていますか?私が読んだ記事の大部分は半分のベクトルを使用していますが、すべてを使用しているわけではありません。この違いの理由はありますか? ジオメトリ用語として次のコードを使用します。 float RayTracer::GeometryGGX(const Vector3& v, const Vector3& l, const Vector3& n, const Vector3& h, float a) { return G1GGX(v, h, a) * G1GGX(l, h, a); } float RayTracer::G1GGX(const Vector3& v, const Vector3& h, float a) { float NoV = Util::Clamp01(cml::dot(v, h)); float a2 = …

1
OpenGLテッセレーションでの頂点ごとの計算
ハードウェアテッセレーションを使用して、位置ベースのクロスシミュレーションを実装しようとしています。つまり、コントロールクワッドをグラフィックスカードにアップロードし、テッセレーションとジオメトリシェーディングを使用して、クロスにノードを作成します。 このアイデアは論文に従います: Huynh、David、「ハードウェアテセレーションを使用したクロスシミュレーション」(2011)。定説。ロチェスター工科大学 http://scholarworks.rit.edu/theses/265/ テッセレーションを使用してシミュレーションポイントを作成する方法を知っています。私が知らないのは、計算された情報をフレームバッファに格納する方法です。 ジオメトリとテッセレーション評価シェーダーには、頂点ごとの計算に必要な情報があります。しかし、フレームバッファに直接書き込むことはできますか? 私が知っているフラグメントシェーダーはフレームバッファーに書き込むことができますが、私の情報は補間され、どの位置に何を書き込むかがわかりません。

1
テクスチャキャッシュはタイルベースのレンダリングGPUでどのように機能しますか
キャッシュはタイルベースのレンダリングでどのように機能しますか? キャッシュヒット率を向上させるためのヒントはありますか?(たとえば、タイルが水平方向に処理され、同じテクスチャを持つ三角形の垂直セグメントがある場合、水平方向に三角形のレイアウトを配置する場合よりも、キャッシュの方が機能しませんか?)

2
GLSLで三角形ポリゴンをオフセット/縮小するにはどうすればよいですか?
頂点シェーダーを使用して、他の独立したすべての(青い)三角形をオフセットする必要があります。三角形全体を操作するために、左(紫)と右(緑)の隣接する頂点を表す各頂点(赤)のカスタム(vec3)属性を作成しました。これから、隣接する両方のエッジから等距離にある(スクリーン空間で)オレンジのポイントを導出する必要があります。各三角形から派生したこのようなオレンジ色の点が3つあるため、処理された(オレンジ色の)三角形がフラグメントシェーダーに渡されます。 理想的には、オフセットが2番目の画像の2番目の三角形のように三角形内の使用可能なスペースを無効にする場合、三角形はカリングされます(背面/レンダリングされないなど)。 データ構造としてTHREE.BufferGeometry()を使用しています。 これが私が目指している効果のスクリーンショットです:

2
Y'CbCrを使用して、2つのR11G11B10Fバッファーを1つにエンコードしますか?
照明を最適化しようとしています。統合グラフィックチップは、メモリアクセスが非常に遅いです。 2つのライトバッファーがあります。1つは拡散反射光用、もう1つは鏡面反射光用です。どちらもフォーマットR11G11B10Fを使用します。2つのバッファーを1つにパックする方法はありますか?たとえば、カラーモデルY'CbCrを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.