問題タブ [fbo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
4468 参照

opengl - OpenGL のメモリ不足エラー、FBO が大きい

PyOpenGL/PyQt で大きな (2^13) フレームバッファ オブジェクトを作成すると、メモリ不足エラーが発生します。

与えます:

ただし、2^12 テクスチャまたは FBO にステップダウンすると、これはうまく機能します。

それぞれ約132 MB 268 MB (4 バイト * 8192^2)の 2 つのイメージ (FBO + texure) で1 GB のビデオ メモリがいっぱいになるのは、私には不合理に思えます。私は何が欠けていますか?

0 投票する
2 に答える
6150 参照

opengl - GLSLで複数のFBOテクスチャにアクセスして、別のテクスチャを作成する

4つのテクスチャを作成し、fbo_texture0--fbo_texture3という名前でFBOにアタッチしました。次のスクリーンショットに示すように、これらはすべて正常に作成されています。

FBOのテクスチャ 画像1

ここで、GLSLを使用して前のテクスチャ(fbo_texture0 --fbo_texture3)から取得した5番目のテクスチャを作成したいと思いました。今のところ、最初のテクスチャを5番目のテクスチャにコピーしたいだけです。残念ながら、これが私が得たものです:

テクスチャが失敗する 画像2

質問は:

  1. GLSLでこれらのfboテクスチャにアクセスするにはどうすればよいですか?
  2. 5番目のテクスチャを作成するにはどうすればよいですか?(または最初のテクスチャから5番目のテクスチャにコピーしますか?)

プログラムの完全なコードは次のとおりです(必要な場合)。

頂点シェーダーは次のとおりです。

そして、これがフラグメントシェーダーです。

編集#1

@Damonによって提案されたようにコードを変更した後(コードも編集されています)、結果のスクリーンショットは次のとおりです。

ここに画像の説明を入力してください 画像3

今、私は実際に問題が何であるかを本当に知りません。別のテクスチャにアクセスするためにフラグメントシェーダーを変更しようとしましたgl_FragColor = texture2D(tex2, gl_TexCoord[0].st);が、それでも上記と同じ表示が得られました。ですから、それは間違いなくモデルビュー/プロジェクションの問題ではないと思います。

編集#2

問題はまだ不明のままでした。glActiveTexture(GL_TEXTUREn);ただし、プログラムで1つのコマンドのみを指定し、他のコマンドをコメントアウトしようとするとglActiveTexture(シェーダーを変更せずに)、次の結果が得られました。

ここに画像の説明を入力してください 画像4アクティブ化のみglActiveTexture(GL_TEXTURE0);

ここに画像の説明を入力してください 画像5アクティブ化のみglActiveTexture(GL_TEXTURE1);

ここに画像の説明を入力してください 画像6アクティブ化のみglActiveTexture(GL_TEXTURE2);

ここに画像の説明を入力してください 画像7アクティブ化のみglActiveTexture(GL_TEXTURE3);

少なくとも2つをglActiveTexture(GL_TEXTUREn);アクティブにすると、画像5と同じ結果が得られました。それは私に問題が実際に何であるか疑問に思いました。

0 投票する
1 に答える
923 参照

macos - OpenGL: FBO の描画中のテクスチャリング

テクスチャ FBO の描画中にテクスチャ オブジェクトをレンダリングできるかどうかは誰にもわかりませんか? たとえば、テクスチャ ティーポットのレンダリングを示す FBO/テクスチャを生成したいと考えています。これは、ティーポットの鏡面反射を示すために使用できます。

何度か試してみましたが、常に非表示のオブジェクトが返されます。FBO/テクスチャには、線やその他のテクスチャのないシェーディング オブジェクトが表示されますが、テクスチャのあるオブジェクトは表示されません。変...

-- 同じシーンをメイン フレーム バッファに直接描画すると問題なく動作します。テクスチャーのあるオブジェクトとテクスチャーのないオブジェクトは正常にレンダリングされます。

-- レンダリング先のテクスチャ ID が、FBO/テクスチャの生成時に使用されません。したがって、循環バインディングはありません。

-- glGetError は glDrawElements の後にエラーを返さないので、それは問題の原因ではありません。

-- テクスチャ座標は正しいです。

-- 私のグラフィック カード (Intel x3100) は確かに Mac OS-X 10.6.7 で OpenGL 2.0 をサポートしており、FBO サンプル プログラムは正常に動作します (ただし、テクスチャリング機能はありません)。

これはおそらく本当に単純なものですが、私はそれを見つけることができません...


それが不可能な場合、これを行うための推奨される方法は何ですか? シェーダーで?これには何らかの形のマルチテクスチャリングが必要ですか?

0 投票する
2 に答える
25425 参照

opengl - ピクセル バッファ オブジェクト (PBO) を使用してフレーム バッファ オブジェクト (FBO) からピクセル値を読み取る

Pixel Buffer Object (PBO) を使用して、FBO からピクセル値を (glReadPixels を使用して) 直接読み取ることはできますか?

もし、そうなら、

  1. FBO で PBO を使用する利点と欠点は何ですか?
  2. 次のコードの問題は何ですか

{

以下の glReadPixels は正常に動作します

次の glReadPixels は機能しません:(

0 投票する
2 に答える
6052 参照

opengl - フレームバッファオブジェクト(FBO)とレンダリングと深度バッファの関係

私はウェブ上で次のような多くの例を見ました(例えば

  • FBOを作成してバインドする
  • バッファの作成とバインド(テクスチャ、レンダリング、深度、ステンシル)
  • 次に、BUFFERSのバインドを解除します
  • FBOを使用するには-FBOをバインドし、作業を行ってからFBOをバインド解除します
  • ただし、読み取り、書き込みなどのテクスチャBUFFERをテクスチャBUFFERにバインドすることもできます。
  • しかし、他のバッファ(レンダリング、深さ、ステンシル)の再バインドは決して見られません。なぜですか?

BUFFERSの作成とバインド/アンバインドの例(以下のコードは、私が説明した内容を示すためだけのものであり、完全に機能します)、

1.なぜ、すべてのBUFFERを再度バインドする必要がないのですか(つまり、オブジェクトの操作/描画中にFBOにバインドする必要があります)。

2.ここで内部で何が起こっているのですか?

編集:アタッチ->バインドおよびデアタッチ->バインド解除

0 投票する
2 に答える
1950 参照

opengl - フレーム バッファ オブジェクト (FBO) を使用した画面外の複数のレンダー ターゲットか?

状況:ビューポート(サイズ= 600 * 600)とカメラは一定のままで、さまざまな変換と回転を使用して、形状と対応するエッジ(ソーベルフィルターまたは独自のフィルターを使用)のNサンプルを生成します。つまり、N 個のサンプル + N 個の対応するエッジがあります。

このようにしようと考えているのですが、

2 つのレンダーバッファで 1 つの FBO を使用します [つまり、各バッファのサイズは = (N *600) * 600 になります]- N シェイプの場合は 1 つ目、対応するシェイプのエッジの場合は 2 つ目

質問:

  1. 上記のことを達成するための最良の方法はどれですか?
  2. ビューポートのサイズは 600*600 ピクセルですが、形状は約 50*50 ピクセルしか占有しません。バウンディング ボックス/AABB 領域のエッジ検出を 2 番目のバッファーのみに適用する効率的な方法はありますか? また、効率的な方法で 2N バウンディング ボックス (N サンプル + N 対応するエッジ) を読み取るだけですか?
0 投票する
2 に答える
940 参照

opengl - OpenGL: フレームバッファを 1 つだけ使用し、ターゲット テクスチャを切り替える

複数のフレームバッファ オブジェクトを使用する代わりに、1 つだけ作成し、必要に応じてターゲット テクスチャを切り替えることで同じ結果を得ることができますか?

  • これはすべての場合に悪い考えですか?はいの場合、なぜですか?

私はrender.SetTargetTexture()自分のプログラムの API に関数を実装してきましたが、バックグラウンドで使用されるフレームバッファがこれ以上あると論理的に機能しません。その場合、フレームバッファを完全に公開する必要があります。

0 投票する
4 に答える
1132 参照

opengl - OpenGL/OpenGLES でのフレームバッファ テクスチャの動作

OpenGL/ES では、テクスチャへのレンダリング機能を実装するときに、フィードバック ループ (書き込み先と同じテクスチャからピクセルを読み取る) が発生しないように注意する必要があります。明らかな理由から、テクスチャの同じピクセルを読み書きするときの動作は未定義です。ただし、同じテクスチャの異なるピクセルを読み書きしている場合も未定義の動作ですか? 例としては、内部にレンダリング テクスチャを含むテクスチャ アトラスを作成しようとしていた場合です。テクスチャへのレンダリング中に、テクスチャ アトラスに保存されている別のテクスチャからピクセルを読み取ります。

テクスチャで同じピクセルを読み書きしていないので、データが同じテクスチャから来ているという理由だけで、動作は未定義と見なされますか?

0 投票する
1 に答える
5074 参照

opengl - OpenGL: 画像をテクスチャ配列にロードする

次のスニペットで、複数のテクスチャ (8x8 *.bmp 画像から) を複数の FBO にロードしようとしています。

ただし、 glTexSubImage3D 関数を使用してこれらのテクスチャを添付することはできません。CheckGLErrors() は、エラーが次の行にあることを示し、「無効な値」エラーを示しています。

マニュアルを読んだ後、エラーは次のステートメントに関連していると思います。

w がGL_TEXTURE_WIDTH、h は GL_TEXTURE_HEIGHT、d は GL_TEXTURE_DEPTH、b は変更されるテクスチャ イメージの境界幅です。w、h、および d には、ボーダー幅の 2 倍が含まれることに注意してください。

そのため、これらのテクスチャを機能させる方法についての手がかりがありませんでした。何か案は?前もって感謝します。

0 投票する
1 に答える
1402 参照

c++ - GL_FLOATテクスチャをCOLORアタッチメントとしてFBOに割り当てることはできますか?

テクスチャへのオフスクリーンレンダリングの場合、添付ファイルGL_COLOR_ATTACHMENT0で次のように定義されたテクスチャをアタッチします。

glTexImage2D(GL_TEXTURE_2D、0、GL_RGBA、width、height、0、GL_RGBA、GL_FLOAT、NULL);

次に、vec4を出力するフラグメントシェーダーを使用してFBOにレンダリングするので、通常は問題ありません。テクスチャが正しく表示されていることを確認するには、関数を使用します

glTexSubImage2D()

テクスチャの中央にいくつかの灰色のピクセルを追加します。テクスチャは正しく表示されますが(これらのピクセルは適切な場所に完全に表示されます)、残りのテクスチャはノイズの多いアーティファクト(黒でない場合)のみです。

これは、GL_RGBAテクスチャにGL_FLOATを使用しているという事実から来ていますか?はいの場合、GLSLでuvec4をvec4に変換するにはどうすればよいですか?メインシェーダーの出力はvec4であり、usampler2Dテクスチャのuvec4出力を最終的なvec4に変換する方法がわかりません。

あなたが提供するかもしれないどんな答えにも感謝します:)

編集:解決策を見つけました:2つのレンダリングの間にGL_COLOR_BUFFER_BITをクリアしませんでした。