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

OpenGLグラフィックスライブラリの使用に関する質問。

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

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

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

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

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

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

1
GL_LINESで入力順序を変更すると結果が異なるのはなぜですか?
コード: #include <math.h> #include <GL/glut.h> #pragma comment(lib, "opengl32") #include <gl/gl.h> #include <gl/glu.h> //Initialize OpenGL void init(void) { glClearColor(0, 0, 0, 0); glViewport(0, 0, 500, 500); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 500, 0, 500, 1, -1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void drawLines(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0); glBegin(GL_LINES); glVertex3d(0.5, 0.999, 0.0f); glVertex3d(499.501, 0.999, 0.0f); glEnd(); glFlush(); …

1
描画呼び出しは、並行して実行されますか、それとも順次実行されますか?
これは、GameDev SEで回答した質問のフォローアップです。問題は、OpenGLのglDrawArraysInstancedがそれらのインスタンスを描画するときに並列であるかどうかだけでした。 私の答えは、「たとえば、2つの描画呼び出しが同じ頂点シェーダーを使用する場合など、GPUが複数の事柄に応じて複数の描画呼び出しを並行して実行する可能性がある」というものでした。ここに完全な答えがあります。 OPが述べたコメントで、「シーケンシャルである必要があると思います。結局のところ、ブレンディングモードの一部はシーケンスに依存しています」 今、私は少し混乱しています。それに対する私の答えは、それが有効である場合でもそれらを並列化しますか?誰かがこれを明確にできますか?
8 opengl  gpu 

1
ゲームビデオのスクリーンキャプチャ
実行中のゲームに「フック」して、マリオブラザーズと言い、レンダリングされた各フレームをキャプチャします...そのフレームを画像ファイルに保存します。類似の良い例がFRAPSです。-注:画面/デスクトップ全体をキャプチャしたくありません。ターゲットウィンドウをキャプチャしたい。 私はOBS(Open Broadcasting Software)を見てきましたが、それほど高速ではありません。誤解しないでください。それは素晴らしいソフトウェアですが、残念ながらドキュメントがなく、cおよびc ++で書かれた大規模なプロジェクトは、cからc ++の初心者プログラマにとってほとんどアクセスできません。 私もGamingAnywhereを確認しましたが、残念ながら、動作させることができません。ドキュメントがほとんどないか、まったくなく、VS2010でのみ実行され、乱雑です(変数の命名が不適切)。ただし、これは研究プロジェクトであるため、文書化されておらず、厄介です。 これはOpenGL、GDI、Direct3Dで実行できることを知っていますが、ネット上で良い例を見つけることができません。 私はglReadlPixels(OpenGLを使用)が使用できることを読み、ドキュメントを読みましたが、この投稿では、実行中のゲーム/アプリケーショングラフィックスへのフックについては何も触れられていません。 質問: Direct3Dなどを使用して、OpenGLで開発されたゲームのグラフィックにフックできますか?フックに使用されるライブラリは、ゲームで使用されるものと同じである必要がありますか? ゲームのレンダリングされたフレームにフックして、それらのフレームを画像ファイルまたはビデオファイルに出力できるようにするにはどうすればよいですか?(ちょうど私が何をする必要があるかについてのいくつかのリンクまたは簡単な説明は素晴らしいでしょう) BackBuffer-私は、フレームを取得するためにBackBufferに非常に高速にアクセスすることを読みました。最新のライブラリを使用してこれを行う方法の例を誰かが持っていますか?ほとんどの例は古くなっています。 私の目的のために、明らかに「これはそれよりも速い」ですか?つまり、私の目的では、OpenGLの方が高速でしょうか。 積極的に開発され、文書化されているオープンソースプロジェクト(基本的に私が必要とすることを行う)を誰かが知っている場合は、それについて知りたいと思います。

1
シャドウマッピングアーティファクト
私は深度テクスチャを使用してOpenGLのシャドウマッピングをいじっています。深度テクスチャは細かいので、シーンにマッピングできますが、オブジェクトの裏側に奇妙なアーティファクトがあります。 私の質問は、これを引き起こしているものであり、どうすれば修正できますか? 私が使用しているフラグメントシェーダーはかなり単純です(ここに青がない理由に疑問がある場合に備えて、簡単にするために色を取り除いています)。 in vec4 vShadowCoord; uniform sampler2DShadow shadowMap; out vec4 fragColor; void main() { float bias = 0.005; float visibility = 1.0; if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w) visibility = 0.25; fragColor = vec4(visibility); } 編集:必要に応じて、上記のコードのみを使用する最低限の作業例のスクリーンショット(色なし)。

2
部分モデルマトリックスを頂点シェーダーにアップロードした方がよいのはいつですか?
現在のところ、シーンをレンダリングするとき、およびシーングラフを反復処理するとき、各ノードのモデルマトリックスは、親のモデルマトリックスとシーンノードのポーズから計算されます。これは非常に単純で、行列の乗算の数をノードとフレームごとに1回の乗算にすでに減らしています。 しかし、これらのすべての行列乗算は、シーンノードの(複数の連続した)動きを非常に高速に実行できるように、CPUとすべてのフレームで実行する必要があります。ただし、GPUは多くの行列乗算を実行するのに適しているため、CPUですべてを計算するのではなく、複数の部分モデル行列を頂点シェーダーに送信することを検討しています。 この場合、すべての計算がすべてのノードではなくすべての頂点に対して行われるため、実際にはパフォーマンスが低下するため、GPUにすべてのパーツ(したがって、すべてのノードのポーズ)を送信することはおそらく意味がありません。しかし、多くの子を持つシーンノード、または(親に対して)移動しない子のみを持つシーンノードは、モデルマトリックスを分割し、乗算をシェーダーにシフトする場所になる可能性があります。 では、部分モデルマトリックスをシェーダーに送信して、乗算をGPUに移動するのはどのような場合に適していますか?それともこれは単に悪い考えですか?

1
追加のコピーなしで、計算シェーダーを使用して圧縮テクスチャに書き込む
コンピューティングシェーダーを使用してOpenGLテクスチャを生成する最善の方法を理解しようとしています。これまでのところ、ピクセルバッファーオブジェクトは非ブロッキングCPU-> GPU転送に適していること、およびコンピューティングシェーダーは、どのようにバインドされているかに関係なく、バッファーを読み書きできることを確認しました。理想的には、できるだけ多くのコピーを避けたいと思います。つまり、GPUにバッファーを割り当て、圧縮されたテクスチャデータをGPUに書き込み、そのバッファーをシェーダーのテクスチャオブジェクトとして使用します。 現在、私のコードは次のようになります。 GLuint buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer); glBufferStorage(GL_SHADER_STORAGE_BUFFER, tex_size_in_bytes, 0, 0); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); // Bind buffer to resource in compute shader // execute compute shader glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer); glCompressedTexImage2D(GL_TEXTURE_2D, 0, fmt, w, h, 0, tex_size_in_bytes, 0); これは正しいです?同期の保証についてもどこかで読みました。バッファオブジェクトからコピーする前に、コンピュートシェーダーが実行を完了させるために何を追加する必要がありますか?

1
水中での霧のレンダリング
次のように、カメラまでの距離に基づいてフォグとサーフェイスカラーをブレンドするglFogを知っています。 方程式はドキュメントにも記載されています。しかし、霧はカメラの前ですぐに適用されます。私は水面をレンダリングしようとしていて、それをある程度の深さにしたいと思っています。たとえば、 現時点では、以下のように水面をアルファブレンディングでレンダリングしています。私が必要なのは、水面から水底までの距離に基づいた霧を作ることです。この距離を取得するにはどうすればよいですか?今のところ、カメラは常に水上にあると想定しています。
8 opengl  fog  depth-map 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.