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

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

2
最新のOpenGLでユニフォームを処理するための良いアプローチは何ですか?
私は最新のOpenGL(3.1以降)を使用してレンダラーを作成していますが、今ではユニフォームを処理する効率的で柔軟な方法を作成しようとしています。私は、均一なバッファオブジェクトと、これらを使用するための「一般的な」アプローチとは何かを調べてきました(後者は、残念ながら、期待していたほど多くの結果が得られませんでした)。 OpenGL API呼び出しを減らし、連続したメモリにデータを保存するために、GPUにアップロードする必要がある各データ構造に対して複数の大きなバッファーを作成することを検討しています。各バッファの最大サイズは16kbです(私が理解しているところによると、これはUBOで使用できることが保証されています)。オブジェクトがユニフォームをGPUにアップロードできるようにしたい場合、まだいっぱいではない、アップロード対象のタイプの最初のバッファーをフェッチし、そのバッファー内で次に使用可能なインデックスを取得します。オブジェクトが描画されると、UBOがバインドされ(まだバインドされていない場合)、UBOの要素インデックスがアップロードされます。 これにより、次のような結果になります。 layout(std140) uniform ModelData { mat4 model_matrix[kNumInstancesPerModelUbo]; } uniform int u_ModelDataIndex; layout(std140) uniform SkeletonData { mat4 bone_transforms[kNumInstancesPerSkeletonUbo][kMaxBones]; } uniform int u_SkeletonDataIndex; ただし、次のことも検討しています。 layout(std140) uniform MeshData { mat4 model_matrix[kNumInstancesPerMeshUbo]; mat4 bone_transforms[kNumInstancesPerMeshUbo][kMaxBones]; } uniform int u_MeshDataIndex; いくつかの点で、これは、アップロードされるメッシュに関連するすべてのデータにアクセスするために単一のインデックスを必要とするという点で、はるかにきれいに感じられます。一方、これは手に負えない可能性があります(16kbより大きいバッファーサイズ、無関係なデータ(スケルトンのないメッシュなど)へのハンドル)、またはモデルマトリックスのアップロード中にボーンを言うためのアクセスが許可されていないため、同期の問題も発生します)これがGPUのメモリレイアウトにどのように影響するかはわかりません。 率直に言って、私はここで立ち往生しているように感じ、UBOを高速で柔軟に処理する方法の具体的な例を見つけることができません。 ここで私を助けることができるアドバイスやリソースはありますか?

2
パストレースから高周波ノイズを除去するアルゴリズム
私はしばらく自分のレンダラーに取り組んでいますが、収束するまで長時間待つ以外に、レンダリングされた画像からモンテカルロノイズを削除する方法はあるのでしょうか。 私が見つけた方法は、画像の品質/シャープネスを大幅に低下させるため、画像をぼかすことですが、これはあまり役に立ちません。さらに、サンプル数の多い小さな画像をレンダリングしてから拡大することで、同じことを実現できます。 パストレースで画像のノイズに対処するために設計されたアルゴリズムはありますか?

2
コンピュータグラフィックスで可能な最も物理的に正確な色の表現は何ですか?
物理的な精度を追求するソフトウェアで色を表現するための理論的モデルと実装モデルを探しています。 「色は心の中にしか存在しない」こと、「物理的な正確さ」を探す意味ではないことはわかっていますが、それでも、スペクトルサンプリングやその他の色の単純なRGBへのより精巧な表現はどれほど優れているのでしょうか。メリットはありますか?パフォーマンスの他にどのような欠点がありますか(またはパフォーマンスが欠点ですか)?

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

1
許容できる品質のシャドウマッピングテクニックの検索
最近、従来のシャドウマッピングのシャドウニキビ問題の解決を模索しながら、指数シャドウマップを実装しました。トリックはありましたが(ニキビはまったくありません)、同時に他の許容できないエラーが発生しました。 深度マップのぼかしには、最小のsigma = 1のガウスぼかしを使用します。 シャドウマップのテスト: float occluder = texture(shadowMap lightCoords.xy).r; float c = 5000.0; float receiver = lightCoords.z; float shadow = exp(c*(occluder-receiver)); shadow = clamp(shadow, 0.0, 1.0); 小さなc係数c=100.0: 許容できない光のにじみ 高いc係数でc=5000.0: 光のにじみはありませんが、高周波の細部が「腫れ」ているように見えます。 最適なcを見つけることができません-でも光のにじみが現れc=3000.0、高周波のシャドウエラーが既に発生しています。デプスマップをぼかすことは役立ちませんが、エイリアシングが発生します。 そして私の質問は、このテクニック(ESM)をどのように改善できるか、または別のテクニックを探す必要があるかどうかです。ウィッチャー3やフォールアウト4などの最新のゲームで見られるように、優れたパフォーマンスを備えた高品質のシャドウは間違いなく可能だと思います。

2
良い色の類似性メトリックとは何ですか?
[0,1]にはRGBの色がいくつかあり、人間に知覚されるように、それらの類似性を評価する方法を見つけたいと考えています。 私は2つのアイデアを念頭に置いていますが、他のオプションもあると確信していますが、どちらが最善であるか、またはおそらく最善ではなく、トレードオフのみであるかどうかはわかりません。 私の最初のアイデアは、RGBカラーをXYZポイントとして扱い、それらの距離を計算することです。 私が持っている別のアイデアは、RGB値をヒストグラムとして扱い、ドット積を使用してそれらの間の類似値を取得することです。値が大きいほど優れています。 ただし、すべてのカラーチャネルが知覚される明るさが同じであるとは限らないので、両方の場合にカラーチャネルに異なる重みを付ける必要がありますか? また、おそらく、カラー値に対してsRGB補正(たとえば、各カラーチャネルのsqrt)を実行する必要があると考えています。 他の色空間が存在することも知っているので、類似性の値を指定するのに適しているのかもしれません。 これに対するもう1つの課題は、異なるディスプレイが同じカラー値を異なる方法で表示することです。これがこの場合に関連するかどうかはわかりません。 ヘルプ/指示を提供できる人はいますか?
8 color 

1
このロシアのルーレットのコードは正しいですか?
レンダラーの実装方法を学ぶために、他のリソースの中でwww.scratchapixel.comを使用しています。このページから次のコードを見ています。マテリアルを通過するフォトンのパケットが検討されています。フォトンパケットごとに、重みが初期化されます。は吸収の確率です。www111dwdwdw 私にとって混乱するのは、からを引くときです。は光子の吸収されていない割合であるため、パケットのフルウェイトが場合、これが理にかなっていることがわかります。例えば、吸収の確率がある場合次いでと光子のが残っています。これが後続の反復でどのように意味をなすかわかりません。たとえば、反復2では、なので、この反復では3番目ではなく半分の光子が吸収されます。dwdwdwwww1111−dw1−dw1 - dw33%33%33\%w=1−0.33=0.67w=1−0.33=0.67w = 1 - 0.33 = 0.6767%67%67\%w=0.67−0.33=0.34w=0.67−0.33=0.34w = 0.67 - 0.33 = 0.34 int photons = 10000; ... int m = 5; // there's 1 over 6 chances for the packet to be absorbed for (int i = 0; i < nphotons; ++i) { float w = …

2
異方性フィルタリング(AF)を把握する
最近、テクスチャフィルタリング、つまり最近傍フィルタリング、バイリニアフィルタリング、トリリニアフィルタリング、異方性フィルタリング、MIPマップ、RIPマップなどについて読んでいます。 高レベルの観点からは、異方性フィルタリングを除いて、これらの手法、動作方法、および存在する理由を理解できると思います。異方性フィルタリングは私を混乱させています。 カメラに対してある角度であるサーフェスをテクスチャリングする必要があるという問題を確認できますが、台形のフットプリントをサンプリングすることでこれをどのように解決できるかわかりません(結果は確認できます)。これはおそらく、台形のフットプリントがどのように計算され、テクスチャをサンプリングするために囲まれたテレックスがどのように重み付けされているかを理解していないためです。 Nvidiaによるこの記事では、「テクセルが台形である場合」または「異方性フィルタリングがミップマップの高さまたは幅をテクスチャの遠近歪みに対する比率でスケーリングする」という文を使用することで、さらに混乱します。台形テクセル?MIPmapのスケーリング?これはどういう意味ですか? AFとAFレベルの仕組みを理解するのを手伝ってくれませんか? 私の目標は、OpenGLまたはDirectX AFの実装ではなく、AFが高レベルの観点からどのように機能するかを理解することです。

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

1
Colorクラスの精度(ハーフ、フロート、ダブルなど)はどれくらいですか?
OpneGLの下でリアルタイムアプリケーションが色を処理する方法を読んでいると、いくつかの例ではColorを4のコレクションとして実装し、他の例では4 floatsを使用していることに気付きましたdoubles。色を4として節約することを提唱するゲーム開発分野での頂点圧縮の例を見たこともありshortます。 これらすべてから、これについてもっと学ぶことに熱心になりました。OpenGl(またはハードウェア)が色に対して処理する限界精度はどのくらいですか?しかし、もっと重要なのは、それを超えると色の違いに気付かなくなる精度の限界は何ですか? それについてもっと注意深く学ぶと、さまざまなアプリケーションやシナリオ(たとえば、メモリ、速度、色の多様性の間でトレードオフの選択を行う)にColorクラスを実装する方法をよりよく考えて決定するのに役立つだろうという印象があります。 これについてあなたの考えをありがとう。

1
均一な強度で可視スペクトルを正しくレンダリングする方法は?
画面にレンダリングする可視スペクトルの正しい表現を取得しようとしています。私の現在の進歩は、CIE 1931標準オブザーバーのカラーマッチング関数を使用して、この論文で与えられた方程式によって分析的に近似されています。現在の画像は次のとおりです: ここで、背景は理想的に黒ではなく、カラーマッチング関数からの負の寄与を導入することができます。 しかし、問題は、画像の強度が490 nm前後のどこかに落ちているように見えることです。これは、3つの関数の合計に最小値があることに関連していると思います。波長に対してプロットされた合計を確認します。 だから私の質問は今です:画像の強度をどのように修正するのですか?波長をRGB / XYZ表現に変換するときに分光感度を考慮するための標準はありますか?
8 color 

1
シェーダーとCUDA / OpenCLの計算
だから私は最近、Compute Shaderについて学んだばかりで、CUDAやOpenCLで行う並列プログラミングと同じアイデアを私が見つけたものから、シェーダーパイプラインで見ていきます。 シーンに100万の立方体を描画したい場合は、どちらか一方または両方を使用する必要があります。両方をどのように分割して、GPUがシェーダーと別のプロセスの両方を同時に並列計算しないようにする場合

2
インデックス付きメッシュの頂点はポリゴン単位で再処理されますか?
私はGPUのハードウェアレベルで実際に何が起きているのかを少し掘り下げていたところ、少なくとも緑色のボックスについては、パイプラインをかなりよく説明する三角形の NVidiaのLifeを見つけました。私が明確にしていないことの1つは、同じ頂点がさまざまな三角形の束に使用されている場合に、インデックス付きメッシュで何が起こるかです。データは通常、ストリームプロセッサで必要以上に永続化されないため、頂点はラスタライズされた後に破棄されるだけで、新しい三角形に表示されるたびにフェッチされ、頂点シェーダーを再び通過すると思います。誰でもこれを確認できますか?また、ラインストリップモードまたはトライアングルストリップモードではどうなりますか?これらの場合、2つまたは3つの関連プリミティブがラスタライズされるまで、GPUは変換された頂点データをどこかに保持しますか?
8 rendering 

2
均一なサンプリングではなく、ランダムなモンテカルロサンプリングを行うのはなぜですか?
均一なサンプリングではなく、モンテカルロのランダムなサンプルの場所を使用することが一般的であるのはなぜですか? ランダム化されたサンプルを取得することにはいくつかの利点があると思いますが、それらが何であるかはわかりません。 ランダムなサンプルの場所が均一なサンプルの場所よりも優れている点を説明できる人はいますか?


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