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

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

2
2つのベジェ曲線の交差の信頼できるテスト
2つの平面ベジェ曲線が交差するかどうかを確実に見つける方法は?「確実に」とは、曲線が交差する場合にのみ「はい」と答え、交差しない場合のみ「いいえ」と答えることを意味します。交差点が見つかったパラメータを知る必要はありません。また、実装で浮動小数点数を使用したいと思います。 StackOverflowで、曲線の境界ボックスをテストに使用するいくつかの回答を見つけました。曲線が交差していなくても、そのようなテストが交差を報告する可能性があるため、これは私が求めているものではありません。 私がこれまでに見つけた最も近いものは、SederbergとMeyersによる「境界のくさび」ですが、最大で1つと2つ以上の交差を「唯一」区別しますが、最大で0があるかどうかを知りたいです。 1つ以上の交差点。

3
最新のゲームエンジンでのソフトウェアラスタライゼーションの使用法は何ですか?
今四半期はコンピュータグラフィックスコースを受講しています。私たちのラボプロジェクトの1つは、ソフトウェアのラスタライズに関するものです。 現在、私はプロジェクトの提案を計画しており、それを現代のゲーム開発において他の人々に役立つようにする方法を考えています。 少し調べた後、ソフトウェアオクルージョンカリングと呼ばれる手法を学びました。さまざまな解像度のバッファでソフトウェアラスタライズを行います。また、階層zバッファーを使用してオクルージョンを照会できます。 私の質問:ソフトウェアオクルージョンカリング以外の最新のゲームエンジンでのソフトウェアラスタライゼーションの使用法は何ですか?
9 rendering 

2
スペクトルレンダリングはどのように処理されますか?
すべてのスペクトルレンダリングはシミュレーションとして処理されますか?リアルタイム、または単に「完全な物理方程式を解かずにリアルに見える」など、「コンシューマー」レンダリングに合わせたテクニックはありますか? スペクトル効果のレンダリングをどのように処理するかを理解したいと思います。光子は波長の範囲として説明する必要があるようで、表面への入射のいずれか オリジナルを置き換え、スペクトル関数全体で複数の新しいフォトンを解決し、それぞれが独自の新しいベクトルで しきい値を指定して、元の(またはわずかに変更された)光子を維持します 私は既存の仕事の方向に向けられることを望みますが、このトピックの色付けに感謝します。

1
球交差オクルージョン(ハイブリッドレイトレーシング用)
ハイブリッドレイトレーシングについて考えて、次の質問: 2つの中実球とます。私たちは彼らの中心と半径を知っています、そして彼らは空間にいくつかの重なり合うボリュームがあることを知っています。s 2s1s1s_1s2s2s_2 典型的な3Dグラフィックの設定があります。目が原点にあると仮定し、でいくつかの正の球をビュー平面に投影しています。球はビュー平面を超えており、交差していません。fz= fz=fz = ffff ましょう、それらの重複ボリュームで「参加」(いくつかの角度から)、すなわち可視、両方の球の表面上の点である空間における円です。ccc ビュープレーンに投影したときにが表示されるかどうかを計算します。またはが完全に邪魔になる場合は、そうではない可能性があります。s 1 s 2cccs1s1s_1s2s2s_2 これに取り組むためのアイデアはありますか?

1
現代のディスプレイリストに相当するものは何ですか?
表示リストはOpenGLの機能であり、理論的には、後で使用できるようにコマンドのグループを保存することにより、APIのあらゆる部分を高速化できます。私の理解では、これはドライバーのオーバーヘッドを削減するための現在の取り組みに関しては非常に理にかなっています。 ただし、表示リストはバージョン3.1で廃止されました。最新のAPIと同等のものは何ですか?DirectXは同様の機能を公開していますか?そのような機能がなくなった場合、その根拠は何ですか?

1
以前に描いた曲線のセグメントを交差させずに2点を接続する方法
交差せずにポイントペアを接続する必要があります。曲線のセグメントに接続する2つの特定のポイントがあるとします。次に、2つの新しいエンドポイントが再び選択され、これらの新しいポイントも接続する必要がありますが、以前に描画されたカーブと交差せずに、任意の数のポイントペアについて同様に接続します。 これらの曲線のセグメントを見つけて描画する最も簡単な方法は何ですか?
9 algorithm 

1
GPUでルックアップテーブルを使用する場合の最適なメモリアクセス
私は学士号プロジェクトのGPUの等値面アルゴリズムを調査しています(具体的には、実数値のフィールドではなく、バイナリの入出力ボクセルデータのみに集中しています)。したがって、OpenFrameworksで古き良きマーチングキューブのCPU実装があり、それをGLSLコンピューティングシェーダーに移植しようとしている段階で、潜入する前に落とし穴を考慮しています。vertシェーダーとfragシェーダーのみを記述しました以前はそれは私にとってすべて新しいものです。 私の最初の問題は、ワークグループ内の数十または数百のスレッドにわたってルックアップテーブルを効率的に使用する方法です。GPUにはさまざまなタスク用にさまざまな種類のメモリがあることを理解していますが、それぞれがどのように動作するか、どのタイプを使用するかは完全にはわかりません。 Paul Bourkeの古典的なcopypastaテーブルは256 * 16配列なので、スカラーバイトタイプを使用する場合、これはおそらく4kbテクスチャまたはSSBOにパックできます。 問題は、異なるスレッドが互いにつまずくのを防ぐ方法ですか?各ワークグループの多くのキューブは、同じ構成を持つ可能性があるため、バッファ内の同じ場所に同時にアクセスしようとします。これに対処するための回避策または最適化はありますか?

2
基本的に、2Dビットマップはどのようにレンダリングされますか?
64ビットのワードアドレス指定可能なコンピューターがあり、バイナリイメージのビットマップとして格納されている5x7文字(下図のような)をメモリマップディスプレイに出力するようにプログラムしたいとします。 1文字あたり5 x 7 = 35ピクセルなので、1つの単語に35ビットを使用して文字を格納できます。最下位ビットがワードの左側から始まり、上記のように画像の各ピクセルがn番目のビットで表される場合、上記の数値「3」は、01110100010000100110000011000101110としてメモリに格納され、その後に29が使用されません。ビットは0に設定されています。 これは、キャラクターが古い/現代のコンピューターにどのように保存されているのですか?または、代わりにピクセルごとに1バイト/ワードを使用しますか? これらがこの方法で格納されている場合、アセンブリ/マシンコードのルーチン(コンピューターの命令セットアーキテクチャーからのビット単位、算術、およびデータ転送操作などの基本命令のみを使用)は、このデータをディスプレイはこんな感じ?それは次のようなものでしょうか? 更新する現在のピクセルのxおよびy表示座標を特定のレジスタに格納します。 選択した2つのRGB値(この場合、緑の場合は0、255、0、黒の場合は0、0、0)を他の2つの別のレジスタに保存します。 さらに2つのレジスターを5および7に初期化されたカウンターとして機能させ、レンダリングされるイメージの現在の行と列を追跡します。 列レジスタが0ではないかどうかをテストします。そうでない場合は、ビットマップのLSBが1に設定されているかどうかをテストし、結果に応じてそれぞれのRGB値レジスタとxおよびy座標レジスタをANDで結合し、その結果をMOVしますディスプレイ出力レジスタに。 行カウンタレジスタを1だけデクリメントして、0かどうかをテストします。0の場合は、それを5に戻して、y座標を1だけインクリメントし、列カウンタを1だけデクリメントします。 ビットマップを保持するレジスタを1ビット左にシフトします。 JMPから命令へ4。 これを行うためのより簡単またはより効率的な方法はありますか?単一の小さなテキスト文字をレンダリングするような単純なものでさえ、かなりの数の操作を必要とし、約200 CPUサイクルを要するようです。 最後に、マシンレベルのコードにゼロから画像を表示するための優れた書籍やリソースはありますか?この特定の主題について光沢があるか、コードが高級言語で記述されているか、またはマクロを使用するアセンブラ。これらはすべて「不正行為」であり、基本的に最下位レベルで行われていることを説明していません。

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

1
利用可能なすべてのテクスチャユニットを使用することは良い習慣ですか?
バンプマッピングのように、メッシュに複数のテクスチャを適用するときは、通常、テクスチャを最初のいくつかの固定テクスチャユニットにバインドします。異なるテクスチャの異なるメッシュ。しかし、なぜglActiveTextureこれほど多くのテクスチャユニットをサポートするのかと常に疑問に思っていました(前のリンクでは、少なくとも80と表示されています)。 そのため、テクスチャを管理する1つの可能な方法は、使用可能な各ユニットに個別のテクスチャをバインドし、それらを有効のままにして、均一なサンプラーインデックスを更新することです。これにより、テクスチャスイッチの数が減り、レンダリングのパフォーマンスが向上します。テクスチャが最大テクスチャユニットよりも少ない場合は、テクスチャをバインド解除する必要はありません。 これはリアルタイムOpenGLアプリケーションの標準的な方法ですか(これはD3Dにも当てはまると思います)?そして、このアプローチを取ることによる明らかでないパフォーマンスへの影響はありますか?おそらくメモリオーバーヘッド?
9 opengl  texture 

1
WebGL全方向性シャドウマッピングの問題
まず第一に、深度マップとキューブマップを使用したシャドウマッピングに関する多くの投稿を読み、それらがどのように機能するかを理解しています。また、OpenGLを使用してそれらを使用した経験がありますが、実装に問題があります。 「EZ3」という名前の3Dグラフィックエンジンで単一の点光源を使用した全方向シャドウマッピングテクニック。私のエンジンでは、WebGLを3DグラフィックAPIとして、JavaScriptをプログラミング言語として使用しています。これは、コンピューターサイエンスの学士論文のためです。 基本的に、これはシャドウマッピングアルゴリズムを実装した方法ですが、ポイントライトの場合にのみ焦点を当てます。 まず、次のように前面カリングをアクティブにします。 if (this.state.faceCulling !== Material.FRONT) { if (this.state.faceCulling === Material.NONE) gl.enable(gl.CULL_FACE); gl.cullFace(gl.FRONT); this.state.faceCulling = Material.FRONT; } 次に、各キューブマップ面の深度値を記録するために深度プログラムを作成します。これは、GLSL 1.0の深度プログラムコードです。 頂点シェーダー: precision highp float; attribute vec3 position; uniform mat4 uModelView; uniform mat4 uProjection; void main() { gl_Position = uProjection * uModelView * vec4(position, 1.0); } フラグメントシェーダー: precision highp float; …

1
非一様有理Bスプライン(NURBS)の基本
NURBSカーブ(後でサーフェス!)を理解しようとしていますが、その内部の仕組みの基本を理解するのに問題があります。誰かが私にいくつかのことを説明してもらえますか?私がベジェ曲線から来ているので、これら2つの間の比較は特に有用でしょう。 「合理的な基底関数は」ほんの少し(合理的)ベジェ曲線のバーンスタイン多項式のように見えます。パラメータuも0から1に変わりますか? 曲線に「ディテールを追加」する方法は?つまり、ベジエを使用して、より複雑な形状を記述する必要がある場合は、複数のベジエを単に「ステッチ」するだけです。またはそれほど頻繁ではないが、程度を上げる。NURBSの次数を増やすこともでき、いくつかのNURBSカーブを並べて配置できることを理解していますが、これはどのように行う必要がありますか? Wikipediaの記事は、少なくとも私にとっては、この「結び目ベクトル」についてあまり明確ではないようです。とにかくそれは何ですか?
9 nurbs 

1
なぜ複数のガウスぼかしを行うのですか?
複数のガウスぼかしを適用すると、より強いガウスぼかしと同等の効果が得られます。 たとえば、この質問は次のように述べています。複数のガウスぼかしを実行することは、1つの大きなぼかしを実行することと同じですか? ウィキペディアもそれを言っていますが、単一のぼかしでそれを行うのではなく、複数のぼかしでそれを実行することは常に同じかそれ以上の計算になると言います。 複数の連続したガウスぼかしを画像に適用すると、1つの大きなガウスぼかしを適用するのと同じ効果があります。その半径は、実際に適用されたぼかし半径の2乗の合計の平方根です。たとえば、半径が6と8のガウスぼかしを連続して適用すると、\ sqrt {6 ^ 2 + 8 ^ 2} = 10であるため、半径10の単一ガウスぼかしを適用した場合と同じ結果になります。この関係により、処理時間はガウスぼかしを連続した小さなぼかしでシミュレートすることで節約できます—必要な時間は、少なくとも1つの大きなぼかしを実行するのと同じくらい長くなります。 出典:https : //en.wikipedia.org/wiki/Gaussian_blur#Mechanics しかし、私は、リアルタイムグラフィックスで複数のぼかしを行ってより強いぼかしを実現する人々について聞いて読んだことがあります。 計算量の削減でない場合、どのようなメリットがありますか?

1
フォワードレンダリングと遅延レンダリングのパフォーマンスのトレードオフはどのくらいですか?
フォワードレンダリングは、入力ジオメトリとライティング情報から直接表面フラグメントの輝度値を計算するプロセスです。遅延レンダリングは、そのプロセスを2つのステップに分割します。最初に、入力ジオメトリをラスタライズして構築されたマテリアルプロパティ(ジオメトリバッファ、またはGバッファ)を含むスクリーンスペースバッファを生成し、次にG-を組み合わせて各ピクセルの輝度値を生成します。照明情報を含むバッファ。 遅延レンダリングは、多くの場合、フォワードレンダリングの最適化として提示されます。1つの説明は、ライティングはかなり高価であり、オーバードローがある場合は画面に表示されないピクセルをライティングしているのに対し、マテリアルプロパティをGバッファに格納して後でライトする場合は、ライティングするピクセルのみをライティングするということです。実際に画面に表示されます。これはあなたにも、深さ、プリパスを行い、その後にデプステストセットで前方のレンダリングパスを行うことができますことを考えると、実際に延期の利点であるD3D11_COMPARISON_EQUALか、GL_EQUALまたは同等の? 遅延レンダリングには、GPUでより適切にスケジュールする可能性もあります。1つの大きなワープ/波面を小さなジオメトリ波面に分割し、その後小さな照明波面を使用すると、占有率が向上します(同時に飛行中の波面が増えます)。ただし、帯域幅の使用量も多くなります(多数のチャネルをGバッファーに書き込んでから、ライティング中にそれらを読み戻す)。ここでの詳細は明らかにGPUに大きく依存しますが、一般的な原則は何ですか? フォワードレンダリングと据え置きレンダリングのどちらを決定するかについて、他にパフォーマンスに関する考慮事項はありますか?(必要に応じて、各手法のバリエーションを使用できると想定します。つまり、前方向のタイルと遅延後のタイルを比較することもできます。)

1
指定されたアルファを使用して複数のレンダーターゲットをアルファブレンドすることは可能ですか?
レンダーターゲット0からNがあり、RT 0の4番目のコンポーネントに、マテリアルまたはマスクなどで指定されたアルファチャネルがあるとします。 最初のレンダーターゲットのアルファを使用して、ハードウェアコンポジターがレンダーターゲット1からNをブレンドすることは可能ですか?

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