2

(ミップマップスタイルの解像度ピラ​​ミッドを使用して)スタックして最終的な画像に到達する一連のテクスチャがあります。

それらがスタックする方法のために、意味のある画像データが入力されていない場合は、unsignedint値128に初期化する必要があります。IE、128はゼロです。これは、レンダーシェーダーが各テクスチャ値から.5を減算するためです。これにより、後続のピラミッドレイヤーが最終画像を正または負の値でオフセットできるようになります。

(シングルチャネルGL_LUMINANCE)テクスチャを値に初期化する方法がわからないようです!

それをrenderbufferターゲットとして設定し、それにポリゴンをレンダリングしようとしましたが、FBOは不完全としてマークされているようです。また、renderbufferターゲットとしてターゲットを設定し、gl.clear(gl.COLOR_BUFFER_BIT)を使用してみましたが、これも不完全であると見なされます。

明らかなことは、gl.texSubImage2D()を使用して値をコピーすることですが、それは本当に遅いようです...多分それが唯一の方法ですか?私は、それほど多くのメモリ(少なくともフレームに相当する単一の値)を割り当てる必要がなく、非常に遅い(すべてが単一の値である場合、すべてのデータをバッファに書き込む必要があるため)、よりエレガントなものを望んでいました。

WebGLでテクスチャを(デフォルトの)値に設定する唯一の方法は、テクスチャのサイズを変更するか、割り当てることであるように思われます。これにより、テクスチャがすべてゼロに設定されます。

また、ゼロをゼロにすることができるgl.SIGNED_BYTEのようなコピーモードはないようです(つまり、符号付きの値が入力されます)...しかし、これはテクスチャを単一に初期化する問題も解決しません値(この場合はゼロ)。

何か案は?WebGLテクスチャを、値をコピーするだけの古いもの以外の値に初期化するにはどうすればよいですか?

4

2 に答える 2

2

残念ながら、特定の種類のテクスチャにレンダリングできることは、WebGLのベースとなっているOpenGLES2.0仕様では保証されていません。それが機能するかどうかを確認する唯一の方法は、テクスチャを作成し、それをフレームバッファにアタッチしてから、checkFramebufferStatusを呼び出して、FRAMEBUFFER_COMPLETEを返すかどうかを確認することです。残念ながら、多くの場合はそうではありません。

アタッチメントから3つの組み合わせのみが機能することが保証されています

  • COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTEテクスチャ
  • COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTEテクスチャ+DEPTH_ATTACHMENT=DEPTH_COMPONENT16レンダーバッファ
  • COLOR_ATTACHMENT0 = RGBA/UNSIGNED_BYTEテクスチャ+DEPTH_STENCIL_ATTACHMENT=DEPTH_STENCILレンダーバッファ

だからあなたのオプションは

  1. RGBAテクスチャを使用して、128、128、128、???をレンダリングします。fboでそれに(またはgl.clear it)

  2. LUMINANCEテクスチャを使用して、texImage2Dを呼び出します

  3. LUMINANCEテクスチャを使用し、バックバッファまたは希望の色にクリアされた正しいサイズのfboを使用してcopyTexImage2Dを呼び出します(ただし、これが高速であるという保証はありません)
于 2012-06-04T06:46:28.120 に答える