問題タブ [image-unit]

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 投票する
2 に答える
717 参照

opengl - GLSL 4.2 - 画像のサイズを取得するには?

GLSL 4.2 では、image2Dデータ型を imageLoad および imageStore 関数で使用できます。これらの関数はivec、書き込み/読み取りを行うピクセルを決定するために必要です。適切な を計算するにivecは、画像のサイズを知る必要があります。しかし、どうすればこれを取得できますか?

textureSize()画像ではなく、サンプラーでのみ機能するようです。

どうやってするの?

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

opengl - OpenGL 4.2 は画像とサンプラーと同じテクスチャを使用します

image2D と sampler2D と同じテクスチャを使用することは合法 (かつ明確に定義されている) ですか?

現在、GLSL シェーダー内で imageLoad() および imageStore() を使用して、image2D から書き込みおよびロードしています。ただし、テクスチャのいくつかのミップマップ レベルからも読み取り (書き込みではなく) したいのですが、これは imageLoad ではサポートされていません (各ミップマップ レベルを個別の image2D としてバインドする必要があると思いますが、使用可能な画像ユニットの量はかなり限定的)。だから私の質問は、imageStore() の image2D として使用する同じテクスチャを、textureLod() で使用する sampler2D として使用してもよいかどうかです。

0 投票する
0 に答える
471 参照

opengl - image2DArray から image2D へのアクセス

おそらく簡単な質問です。image2D テクスチャのテクスチャ配列 (GL_TEXTURE_2D_ARRAY) があります。image2DArray を介してフラグメント シェーダの配列にアクセスします。配列の画像にアクセスするにはどうすればよいですか? imageLoad() にはレイヤー番号のパラメーターがありますか? 私はここここを読みましたが、それがどのように行われたかわかりませんでした。

問題は、次のようにアクセスした場合です。

つまり、テクスチャ座標の 3 番目の数はテクスチャ レイヤ インデックスです。テクスチャの出力を画面に表示していますが、静的 (カムの動きでは動かない) になり、ずれます。

アップデート:

間違ったテクスチャ オブジェクトを参照していました。はい、imageLoad の ivec3 の 3 番目の座標は、テクスチャ配列レイヤ インデックスをターゲットにする必要があります。

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

opengl - GLSL アトミック イメージ アクセス

の他の投稿は、GLSL スピンロックの種類に関する一般的な情報を収集することを目的としていますが、残念ながら何も得られておらず、問題も解決していません。したがって、具体的な質問です。以下に示す最小限の例に問題を減らしました。

些細な問題で、ロックの画面サイズのテクスチャと色のテクスチャが作成されます。パス 1 では、色はすべてゼロに設定されます (シェーダー 1)。パス 2 では、2 つの三角形が描画され、ジオメトリ シェーダーによって 4 倍になり、わずかにオフセットされます (シェーダー 2)。フラグメント シェーダーは、テクスチャの色をアトミックにインクリメントします。パス 3 では、色が視覚化されます (シェーダー 3)。

シェーダー 1:

シェーダー 2:

シェーダー 3:

メインループ:

  1. シェーダー 1 を有効にする
  2. フルスクリーン クワッドをレンダリングする
  3. glMemoryBarrier(GL_ALL_BARRIER_BITS);

  4. シェーダー 2 を有効にする

  5. 2 つの小さな三角形をレンダリングする
  6. glMemoryBarrier(GL_ALL_BARRIER_BITS);

  7. シェーダー 3 を有効にする

  8. フルスクリーン クワッドをレンダリングする

手順 3 と 6 で、GL_SHADER_IMAGE_ACCESS_BARRIER_BIT を使用できた[と思う]ことに注意してください。念のため、私は保守的です。

視覚化された色は、時間の経過とともにジッターし、ほとんどの場合かなり小さいです。これは、原子性が発生していないことを示しています。誰かがこの手順を正気でチェックできますか? 何か不足していますか?

編集:このページから、使用discardするとフラグメントで画像のロード/ストアが未定義になる可能性があることがわかりました。破棄を削除しましたが、問題は引き続き発生します。また、初期のフラグメント テストを強制するも見つかりましlayout(early_fragment_tests) in;た (どちらも役に立ちませんでした)。

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

c++ - フラグメント シェーダー OpenGL で複数の 3Dtexture に書き込む

次のように、データを書き込み、フラグメント シェーダーでボクセルとして使用する 3D テクスチャがあります。

テクスチャはこのように定義されます

そして、これは私がそれを使わなければならないときに

今私の問題は、非常に遅いことに気付いたので、opengl関数を使用せずに、これのmipmapバージョンが欲しいということです。したがって、すべてのレベルで 3D テクスチャを同時に書き込むことを考えていたので、たとえば、最大解像度は 512^3 で、その 3dtex に 1 つのボクセル VALUE を書き込むと、256^3 に対して 0.125*VALUE も書き込みます。 126 ^ 3などのボクセルと0.015625 * VALUE。原子性を使用するimageStoreを使用しているため、すべての値が書き込まれ、これらの重みを使用して自動的に平均値を取得します(補間とまったく同じではありませんが、満足のいく結果が得られる可能性がありますとりあえず)。だから私の質問は、複数の 3dtexture を持ち、同時にそれらすべてに書き込むための最良の方法は何ですか?

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

opengl - OpenGL 画像のロード/ストア 24 ビット RGB 画像

glBindImageTexture には、24 ビット RGB (3 8 ビット チャネル) 画像の画像形式がないようです。私のテクスチャには、タイプの内部形式GL_RGB8(24 ビット RGB 画像) があります。残念ながら、実行時にイメージ ユニットにバインドしているテクスチャのタイプを簡単に変更することはできません。imageLoad で別のイメージ フォーマットを使用しても、24 ビット RGB データにアクセスできますか?