コンピューターグラフィックス

コンピューターグラフィックスの研究者やプログラマーのためのQ&A

2
最新のGPUで頂点データを整理する最もパフォーマンスの高い方法
私が頂点で構成モデルでは、各持っていると言うposition、normal、tangent、およびtexcoord三角形がインデックストリプルによって指定された属性を、。 頂点の属性だけに注目すると、配列の構造と構造の配列という2つの広範な戦略に気づきます。また、構造体の配列は、特定の頂点の属性のメモリの局所性(したがってキャッシュの局所性)を増加させるため、優先されると聞きました。 これが実際にパフォーマンスを向上させるのですか?これが起こると私が考えることができる主な方法は、長い間キャッシュから削除された頂点データをラスタライザが取得する必要がある頂点インデックスによるものです。頂点データへのアクセスがこのようにランダムである場合、同じキャッシュライン上の頂点のすべての属性を保持すると、確実に処理が速くなりますが、これは、三角形の指定の順序を最適化することでほとんど軽減できる問題ではありませんか? さらに、最近のGPUは、多くのタイプの構造のベクトルよりも、同じタイプの長いベクトルをアンパックする方が優れている可能性があることを理解しています。インデックスの順序が最適化されている場合、配列構造のレイアウトが同じ頂点データの構造配列のレイアウトを一貫して上回ることは可能でしょうか?

1
ブルーノイズサンプリングとブルーノイズテクスチャの間のリンク?
次のポアソンディスクサンプルのようなブルー​​ノイズサンプリングを使用できます。 そして、あなたはこのようなブルー​​ノイズテクスチャを持つことができます: 最初の画像には、1つの入力(サンプルのインデックス)と2つの出力(点のx、y座標)があり、2番目の画像は基本的に2つの入力(x、サンプルのy座標)と1つの出力(ポイントの値)。 しかし、私は興味があります、これらはどのように関連していますか? 2番目の画像のDFTを取得すると、低周波成分よりも高周波成分が多いことがわかりますが、最初のデータポイントのセットのDFTをどのように取得するかわかりません。 他の低い不一致シーケンス(たとえば、halton、またはジッターグリッド)を使用して、2番目の画像のように、アイデアからテクスチャを作成できるかどうか疑問に思っています。
9 sampling 

1
グローのガウスぼかし式に正しい光物理学を適用する
分離可能なガウスぼかしを使用してグローシェーダーを作成しようとしています。 私は最近、短いユーチューブビデオに触発されている「コンピュータの色が壊れている」と私が持っている色補間でそれを台無し彼の提案は美しく、少年! ビデオが話している大きなことは、この原則はぼかしに適用されるべきだということですが、私はかなり混乱しています。値を追加するときに、何を二乗するのか、何を平方するのか、私にはよくわかりません。私の現在の理論では、ガウスぼかしの各テクスチャサンプルは、ベルカーブで重み付けされた2の累乗によって引き上げられ、通常のように合計に追加されます。最後に合計は平方根ですが、それが正しいかどうかはわかりません。誰か確認してもらえますか?これはかなりの違いを生むでしょうか?

4
最新のOpenGLを備えた複数のビューポート?
私はSDL2を使用しています。 現在、私の唯一のシェーダーにはMVPマトリックスがあり、それを使用してポイントを変換します。 GLMを搭載したカメラのビューと投影行列を計算します。 glm::lookAt(pos, pos + forward, up); glm::perspective(fov, aspectRatio, zNear, zFar); 検索しましたが、複数のビューポートのレガシー実装しか見つかりません。 たとえば、4つのカメラを作成して、すべてのカメラが同じであるとしましょう。ただし、すべてのカメラには、レンダリングする画面の四分の一が異なります。(つまり、同じ内容の4つのビューポートが必要です) これどうやってするの?十分な情報を提供できなかった場合は、申し訳ありませんが質問してください。
9 opengl  glm 

4
ディザノイズをクランプする適切な方法は何ですか?
2ビットノイズ(n =] 0.5,1.5 [およびoutput = floor(input *(2 ^ bits-1)+ n)を使用)で色深度とディザリングを減らす場合、値の範囲の終わり(入力0.0および1.0) )うるさい。それらを無地であることが望ましい。 例:https : //www.shadertoy.com/view/llsfz4 (上記shadertoyのスクリーンショット、勾配を描き、両端であるべきで、それぞれ白と黒の固体であるが、代わりにノイズが多いです) もちろん、問題は値の範囲を圧縮するだけで解決でき、両端が常に単一の値に丸められます。これは少しハックのように感じますが、これを「適切に」実装する方法があるかどうか疑問に思っていますか?

1
グローシェーダーを微調整して見栄えを良くする
私は単純なゲームをしていて、その主題はこれらの小さな線です。iOSとAndroidをターゲットにしているため、現時点で実行できるプロセッサの範囲は非常に広いです。 2つの理由でリアルタイムのグローを追加しようとしています ほとんどのデバイスでアンチエイリアスを処理するためのレンダリング時間がないという事実を隠そうとしています。 ゲームの主題は純粋な光であることになっています。つまり、それらのものが純粋な光のように見えるはずです。 私はかなり長い間、分離可能なガウスぼかしシェーダーを微調整してきました、そして私は欲求不満の点に達しました、私はそれを正しく見せることができません、おそらく問題は光のギザギザのエッジを無駄に隠そうとしていることですその間、光をぼやけさせないようにします。 私の最大の問題は、それを最高に見えるようにするために必要なすべての変数です。 私はグラフィックス/レンダリングに非常に慣れており、決してアーティストではありません。恐らく、私にとってのレンディングで最もイライラするのは、関係しているように見えるすべての変数です。輝きをもって私は多くの可能な変化を見てきました。 A.ブレンドモード、スクリーンブレンドモード、またはその他の調合を追加する B.ぼかし、通常の組み合わせ前の重み付け C.ガウスベル関数のシグマ(私はこの 紛らわしい計算機を使用していますが、他の人が持っているのと同じ値を与えていないようです) D. sigma関数に送信される "x"値のスカラー E.サンプルスケール(ぼかし半径を小さくまたは大きくする) F.グローバッファーの解像度を変更する このように多くの変数を扱うときに、どのようにして「最適な」定数を見つけるのでしょうか。 微調整を行ってから変更が表示されるまでの時間が長いため、問題も発生しています。シェーダートイで実行しますが、この画像をロードしたり、そのようなものを手続き的に生成したりすることはできません。 現在、ガウシアンベルカーブカーネルのシグマに悩まされています。特に、プロセッサーの速度が必要なため、数式ではなく数値でコーディングしているためです。使用する良いシグマを提案できますか?

4
バンプマップ、法線マップ、変位マップをガンマ補正しないのはなぜですか?
だから私はかなり技術的な観点からこれに頭を抱えようとしています。 シェーダーにバンプマップ、法線マップ、または変位マップを追加する場合、それらはガンマ補正されるべきではありません。しかし、拡散テクスチャはそうするべきです。しかし、なぜ? JPEG、PNG、またはTIFFなどの形式でファイルを8ビット(または16ビット整数)で保存すると、0.4545(1 / 2.2)のガンマが焼き付けられます。したがって、カメラは実世界(線形)からの光をキャプチャします写真をJPEGとして保存するとき、情報を8ビットに圧縮する方法として、ガンマ値1 / 2.2が追加されます。次に、ガンマ値2.2を追加するモニターで画像を表示すると、輝度が再び線形になります。 したがって、(写真などの)拡散テクスチャを使用する場合、その1 / 2.2ガンマを「削除」して線形にする(線形化と呼ばれる)必要があるため、テクスチャは暗く見えますが、これらの値は数学的な観点からは正しいので、レンダラーは正しい計算をしてください。補足:ソフトウェアは2.2のディスプレイガンマを使用して、テクスチャが正しく見えることを確認しました。これは、内部計算のためだけに線形化されています。しかし、Photoshopでバンプマップを作成してJPGまたはPNGとして保存すると、その1 / 2.2ガンマもその画像に焼き付けられるので、このバンプマップも線形化する必要がないのはなぜですか。 拡散反射光テクスチャの場合と同様に、入力ガンマが2.2の3ds Maxでバンプマップをロードすると、拡散反射光は正しく見えますが、バンプは正しく見えないので、バンプの入力ガンマを1.0に設定する必要があります。正しく見えるようにするためですが、先ほど述べたように、なぜ両方の画像ファイルに1 / 2.2ガンマが焼き付けられているのでしょうか。
9 gamma 

1
OpenGL GLSL-Sobelエッジ検出フィルター
このトピックに関しては、GLSLにSobel Edge Detectionフィルターを正常に実装しました。フィルターのフラグメントシェーダーコードを次に示します。 #version 330 core in vec2 TexCoords; out vec4 color; uniform sampler2D screenTexture; mat3 sx = mat3( 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, -1.0, -2.0, -1.0 ); mat3 sy = mat3( 1.0, 0.0, -1.0, 2.0, 0.0, -2.0, 1.0, 0.0, -1.0 ); void main() { vec3 diffuse = texture(screenTexture, …

1
スキャン変換中のサンプルギャップとは何ですか?
で、このチュートリアル、 エッジを共有する三角形がレンダリングされることがよくあります。OpenGLは、共有されたエッジの頂点位置が同一である限り、スキャン変換中にサンプルのギャップがないことを保証します。 1スキャン変換中のサンプルギャップとは正確には何ですか? 2どのような状況で起こりますか? 3ラインがフラグメントの中心を横切るときに起こりますか?

1
完全なモンテカルロ体積測定散乱
パストレーサーに完全なモンテカルロボリューム散乱を追加したいのですが、その方法を調べるのに苦労しています。私が何をしたいのかを説明しましょう: 光線が材料に入り、BTDFを適用します。その後、ある距離の後に体積散乱イベントが発生し、その後(等方性の場合)、光線は任意の方向に散乱します。球。これは、光線が別のBTDFで材料を出るまで繰り返されます。 私の質問は次のとおりです。 散布イベント間の距離を選択するにはどうすればよいですか?直感は、特定の距離の後に散乱する確率を与える、ある種の散乱PDFがあるべきだと私に教えてくれますか? これは正しいでしょうか? pdfは等方性材料の線形関数になりますか? この関数には、Googleが使用できる名前または何かがありますか? Beer-Lambertはまだスキャッターイベントの間に適用されますか? 私はそうは思いません。Beer-Lambertは実際の散乱計算を単純化したものであるため。 また、Beer-Lambertはマイクロスケールでの計算であり、パストレースはマクロスケールである可能性があります。 BSDFに相当する体積は何ですか?Henyey-Greensteinなどの位相関数を使用して新しい方向を決定できるようですが、減衰には何を使用しますか? 最後に、モンテカルロ体積散乱のより良いGoogleフレーズは何ですか? 体積散乱(SSS)を検索すると、完全なモンテカルロシミュレーション(双極子、内部散乱、外部散乱、拡散など)の簡略化に関する論文、方法、ブログ投稿が表示されます。

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
GPUで共有頂点法線を作成する
私は、CPUからOpenGLコンピューティングシェーダーへのマーチングキューブの実装の移植にほとんど成功しましたが、私はまだ法線に取り組んでおらず、そのための最善の方法を考えていません。 私の実装では特にバイナリ値フィールドを扱います(まだ距離推定器を持たない3Dフラクタル関数をモデル化しようとしているため)、勾配法と前方差分法は機能しません。動作する頂点を共有しました。私のCPU実装では、ここで説明するQuilezの方法を使用して、隣接する各頂点に面法線を蓄積します。 この実装を別のシェーダーに移植することもできますが、これで発生する問題は、必要なアトミックの膨大な数です。私たちはスカラー整数型でのみアトミックを使用でき、3つの符号付き整数を合計可能な方法で1にパックする方法を考えることができないので、シェーダー呼び出しごとに3軸* 3頂点= 9アトミック追加を意味します。もちろん、それらはメモリ全体に分散されるため、1つのアトミックカウンターを9回ヒットするようなものではありませんが、それでもまだかなりのようです。 もう1つの方法は、ポリゴンごとのシェーダー呼び出しを実行して面の法線リストを作成し(おそらくこの方法でx10y10z10にパックすることができます)、次に頂点ごとのシェーダーで隣接する面の法線をすべて蓄積します。ただし、これは膨大なメモリを消費しますが、最悪の場合に対処するには、面インデックスのストレージスペースに頂点ごとに12 intが必要になります。また、特定の頂点に既に書き込まれている面の数を計算するためにアトミックに頼らずに、このストレージに書き込む方法の問題もあります。 誰でもこれを行う方法についてもっと良いアイデアがありますか?

3
曲線に沿った一連の整理されていない点の順序付け
カーブ(つまり、ソリッドのエッジ)に属する一連の3Dポイント(ソリッドボディのテッセレーションを実行するライブラリから復元)があります。つまり、カーブはこれらの各ポイントを確実に通過します。 それにもかかわらず、ポイントセットは順序付けされていないため、この曲線を正しく描画できるようにポイントセットを並べ替える必要があります。 これらのタイプの問題に対する既知のアプローチはありますか? 追加情報: 曲線は一般にパラメトリックです(スプライン/ベジェ、円スライスなど)。 ポイントは浮動小数点座標として与えられます。 ポイントは非常に密に詰め込まれています(ただし、それらは私が望むほど密にできます)。アイデアを与えるために、xで19単位、xで10単位、zで5単位を占める曲線の場合、曲線のセグメントの一連の点を引用します:(20.7622、25.8676、0)(20.6573、25.856、 0)(20.5529、25.8444、0)(20.4489、25.8329、0)(20.3454、25.8213、0)
9 geometry  mesh  curve 

1
テクスチャを双曲線三角形にマッピングする
私はしばらくこれに取り組む方法にこだわっていますので、どんな提案もありがたいです! 右下のユークリッド三角形の形のテクスチャをポアンカレ円盤の双曲線三角形にマッピングしたい。 これがテクスチャです(テクスチャの左上の三角形は透明で未使用です)。エッシャーのサークルリミットIの一部としてこれを認識するかもしれません 申し訳ありませんが、コメントは2つを超えるリンクを投稿することはできません。 そして、これは私のポリゴンのように見えます(これは原点を中心としています。つまり、2つのエッジは直線ですが、一般に3つのエッジはすべて円弧になります)。 ポリゴンの中心は、頂点によって形成されるユークリッド三角形の中心であり、その中心を使用してテクスチャをUVマッピングして、ポリゴンと同じ数の面に分割し、各面を対応するポリゴン面にマッピングしています。ただし、結果は次のようになります。 これがUVマッピングを使用して解決可能であると誰かが思うなら、私はいくつかのサンプルコードを提供できれば幸いですが、これは不可能かもしれないと私は考え始めており、独自のマッピング関数を作成する必要があります。 線分AB、AC、BCは実際には線分ではなく円弧である可能性があるため、@ Nathanの回答を以下のように改善しました。 方法:最長の辺(BCなど)を選び、これを偶数の部分に分割します。他の2つの辺を同じ数のパーツに分割します。次に、これらを接続する線(以下の回答のDE)も、直線ではなく、実際には円弧でなければなりません。必要に応じてこれらの新しい弧を細分割し、新しい三角形を面として追加してから、テクスチャの右下の三角形をこれらの新しい面にUVマップします。 簡単?どういたしまして。しかし、うまくいきました。

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

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