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

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

2
仮想テクスチャリングは実際にどのように効率的ですか?
参考までに、私が言及しているのは、idTech 5のMegaTextureテクノロジーで最初に導入された(私が信じている)テクニックの「一般名」です。それがどのように機能するかについての概要を見るには、こちらのビデオをご覧ください。 私は最近、それに関連するいくつかの論文や出版物をざっと読んでいますが、どうすれば効率的になるのか理解できません。「グローバルテクスチャページ」スペースから仮想テクスチャ座標へのUV座標の絶え間ない再計算が必要ではないでしょうか。そして、それはジオメトリをバッチ処理するほとんどの試みを完全に抑制しないのでしょうか?任意のズームインを許可するにはどうすればよいですか?ある時点でポリゴンを再分割する必要はありませんか? 私にはわからないことがたくさんあり、このトピックに関する実際に簡単にアクセスできるリソースを見つけることができませんでした。

3
一致するサーフェスとのZファイティングの回避
2つのオーバーラップする同一平面サーフェスをレンダリングする場合、一般的な問題は「zファイティング」です。レンダラーは2つのサーフェスのどちらがカメラに近いかを判断できず、オーバーラップ領域に視覚的なアーチファクトを与えます。 これに対する標準的な解決策は、モデルの設計時に表面にわずかなオフセットを与えることです。他の解決策はありますか?
26 rendering 

3
ステンシルバッファーとは
ウィキペディアでは、ステンシルバッファーはシェーダーが使用できる任意のバッファーであると述べています。 ただし、クリッピングや、深度バッファーとピクセルバッファーの "緊密なバインド"に使用されていることを示唆しており、わずかに矛盾しています。 ステンシルバッファーは実際に何をしますか。また、現代のアプリケーションで実際にどのように使用されていますか

2
状態を変更するコストはいくらですか?
プログラマーは、特定の操作のコストについてかなり良い考えを持っているはずです。たとえば、CPUでの命令のコスト、L1、L2、またはL3キャッシュミスのコスト、LHSのコストなどです。 グラフィックに関して言えば、私はそれらが何であるかほとんどわからないことに気付きます。コストで注文すると、状態の変化は次のようになることを心に留めています。 シェーダーの均一な変更。 アクティブな頂点バッファーの変更。 アクティブテクスチャユニットの変更。 アクティブシェーダープログラムの変更。 アクティブなフレームバッファの変更。 しかし、それは非常に大雑把な経験則であり、正確でさえないかもしれません。単位、ns、クロックサイクル、または命令の数を入れようとすると、どれくらいのことを言っているのでしょうか?

1
私の視点の数学は正しいですか?
私は透視変換を使用していくつかのポイントを計算してプロットする必要がある宿題を持っていますが、カメラ座標を使用した3Dプロットは画像座標を使用した2Dプロットとは非常に異なるため、結果が正しいかわかりません。何が間違っているのか理解してもらえますか? これは与えられたものである:カメラがポイントであるW 、T C = [ - 1 、1 、5 ] T、(メートル)の世界座標で指定されました。カメラ座標系は、ワールド参照のY軸を中心にθ = 160 oだけ回転するため、その回転行列はw R c = [ c o s (θ )0 s i n (θ )0 1 0 - s i n (WTC= [ − 1 、 1 、5 ]TWTC=[−1、1、5]T_WT^C = [−1, 1, 5]^Tθ = 160oθ=160o\theta = …

2
モデルビュー行列の転置された逆行列が法線ベクトルの変換に使用されるのはなぜですか?
オブジェクトに変換が適用された3Dシーンをレンダリングする場合、法線はモデルビュー行列の転置された逆行列で変換される必要があります。したがって、法線、modelViewMatrix場合、変換された法線はnnnn ′MMMn′n′n' n′= (M− 1)T⋅ n個n′=(M−1)T⋅nn' = (M^{-1})^{T} \cdot n オブジェクトを変換するとき、それに応じて法線を変換する必要があることは明らかです。しかし、数学的に、これが対応する変換行列なのはなぜですか?

5
2D空間に投影された球体は常に楕円になりますか?
私の直感では、球体が2D空間に投影されると、結果は常に数学的に楕円(または縮退した場合は円)になります。 過去に私が積極的に自分のグラフィックプログラミングを行っていたときに、他の人々と一緒にこれを持ち出し、彼らは私が間違っていることを固く主張していました。私が正しく思い出せば、結果は漠然と「卵形」である可能性があると信じていました。 誰が正しかった? すでに1つの回答が送信されているため、質問を完全に変更するつもりはありませんが、長年にわたってこの分野に精通していないため、重要な詳細を省略してしまいました。 私は、投影が線形アプリケーションである透視投影について具体的に質問するつもりでした。 もちろん、他の投影法は多くの用途で興味深いので、この時点でそれらを削除したくありません。しかし、答えが最も顕著なセクションとして透視図法を持つことができれば素晴らしいと思います。

3
なぜグラフィックスAPIにとってスレッドセーフティがそんなに大きな問題なのですか?
VulkanとDirectX12は両方とも、スレッドセーフな方法で使用可能であると主張されています。人々はそれについて興奮しているようです。 なぜこれがそんなに大きな機能と見なされるのですか?とにかく、「実際の」処理は別の処理ユニットのメモリブリッジを介してスローされます。 また、非常に大きい場合、スレッドセーフなグラフィックスAPIが登場したのはなぜですか?

1
Perlin Noiseが「ブロック状」に見えるのはなぜですか?
自分で Perlin Noiseを実装しようとしました理論だけを使っ(flafla2.github.io/2014/08/09/perlinnoise.htmlに続きます)。残念ながら、「オリジナル」のパーリンノイズの外観を実現できませんでした。 以下のコードがPerlin Noiseのブロックバージョンをレンダリングする理由は何ですか? アーティファクトなしでPerlin Noiseをレンダリングするために、コードを改善/変更する必要があるものは何ですか? 補間方法またはgradsベクトルに問題がある可能性があります。gradsすべての4つの近くの格子点について-ベクトルドット(格子点ランダムベクトル)の生成物および(サイズのベクター)を含みます。(ランダムおよびサイズのベクトルは、最初のリンクで説明されています。) GLSLサンドボックス:http : //glslsandbox.com/e#32663.0 float fade(float t) { return t * t * t * (t * (t * 6. - 15.) + 10.); } vec2 smooth(vec2 x) { return vec2(fade(x.x), fade(x.y)); } vec2 hash(vec2 co) { return fract (vec2(.5654654, -.65465) * dot …
21 glsl  noise  artifacts 


3
ロシアンルーレットは本当に答えですか?
パストレースの一部の実装では、ロシアンルーレットと呼ばれるアプローチを使用して、一部のパスをカリングし、他のパス間でその寄与を共有することを確認しました。 貢献の特定のしきい値を下回るまでパスをたどり、それを放棄するのではなく、別のしきい値が使用され、そのしきい値を下回る貢献のパスはわずかな確率で終了することを理解しています。他のパスは、終端されたパスからの失われたエネルギーを共有することに対応する量だけ寄与が増加します。これがテクニックによって導入されたバイアスを修正することなのか、それともバイアスを回避するためにテクニック全体が必要かどうかは、私にはわかりません。 ロシアンルーレットは公平な結果をもたらしますか? ロシアンルーレットは公平な結果を得るために必要ですか? つまり、小さなしきい値を使用し、そのしきい値を下回る瞬間にパスを終了するだけで、より偏った結果またはより偏りのない結果が得られますか? 任意の数のサンプルが与えられた場合、両方のアプローチは不偏の結果の画像に収束しますか? ロシアンルーレットアプローチを使用する根本的な理由を理解したいと考えています。速度や品質に大きな違いはありますか? 総エネルギーを保存するために、他の光線にエネルギーが再分配されることを理解しています。ただし、レイがしきい値に達した後にランダムに決定された寿命を持つのではなく、固定されたしきい値を下回るとレイが終了した場合、この再配布はまだ実行できませんか? 逆に、エネルギーを再分配せずにレイを終了することによって失われるエネルギーが最終的に失われる場合(再分配されるレイも最終的に終了するため)、これは状況をどのように改善しますか?

1
レイトレーシングでのアンチエイリアス/フィルタリング
レイトレーシング/パストレースにおいて、画像のアンチエイリアスを行う最も簡単な方法の1つは、ピクセル値をスーパーサンプリングし、結果を平均化することです。IE。ピクセルの中心を通してすべてのサンプルを撮影する代わりに、サンプルをある量だけオフセットします。 インターネットを検索してみると、これを行うために多少異なる2つの方法が見つかりました。 必要に応じてサンプルを生成し、フィルターで結果を比較します 1つの例はPBRTです フィルターの形状に等しい分布を持つサンプルを生成します 2つの例は、smallptとBenedikt Bitterliのタングステンレンダラーです。 生成と計量 基本的なプロセスは次のとおりです。 必要に応じてサンプルを作成します(ランダム、成層、低差異シーケンスなど) 2つのサンプル(xおよびy)を使用してカメラレイをオフセットします。 レイでシーンをレンダリングする フィルター関数とピクセル中心を基準としたサンプルの距離を使用して重みを計算します。たとえば、ボックスフィルター、テントフィルター、ガウスフィルターなど) レンダリングから色に重みを適用します フィルターの形で生成する 基本的な前提は、逆変換サンプリングを使用して、フィルターの形状に従って分散されるサンプルを作成することです。たとえば、ガウスの形で分布するサンプルのヒストグラムは次のようになります。 これは、正確に実行するか、関数を個別のpdf / cdfにビニングすることで実行できます。smallptは、テントフィルターの正確な逆累積分布関数を使用します。ビニング方法の例はこちらにあります ご質問 各方法の長所と短所は何ですか?そして、なぜあなたは他の上に1つを使用するのですか?私はいくつかのことを考えることができます: Generate and Weighは最も堅牢であるようであり、任意のサンプリング方法と任意のフィルターの任意の組み合わせが可能です。ただし、ImageBufferの重みを追跡し、最終的な解決を行う必要があります。 フィルターの形状で生成は、負のpdfを持つことができないため、正のフィルター形状のみをサポートできます(つまり、Mitchell、Catmull Rom、またはLanczosはサポートしません)。ただし、前述のように、重みを追跡する必要がないため、実装が簡単です。 ただし、最終的には、メソッド2はメソッド1の単純化と考えることができます。これは、本質的に暗黙的なボックスフィルターの重みを使用しているためです。

3
ベクターグラフィックスとビットマップまたはラスターグラフィックスのパフォーマンス
ベクトルグラフィックスを使用することもありますが、それは単にある場合には少しだけ見た目がいいからであり、また、ビットマップ/ラスタグラフィックスを使用する場合もあります。 私は疑問に思っていましたが、これら2つのオプションの間にパフォーマンスの大きな違いはありますか?

1
OpenCLで再帰が禁止されているのはなぜですか?
レイトレースされた画像のレンダリングを高速化するためにOpenCLを使用したいのですが、WikipediaページではOpen CLでは再帰が禁止されていると主張しています。これは本当ですか?レイトレーシング時に再帰を広範囲に使用するため、高速化のメリットを享受するには、かなりの量の再設計が必要になります。再帰を防ぐ根本的な制限は何ですか?それを回避する方法はありますか?

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; …

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