THREE.js のマテリアルで FBO を使用しようとしています。最終的なビジュアライゼーションをフレーム バッファ オブジェクトに出力する GPU ベースの流体シミュレーションがあり、これを使用してメッシュのテクスチャを作成したいと考えています。これが私の単純なフラグメントシェーダーです:
varying vec2 vUv;
uniform sampler2D tDiffuse;
void main() {
gl_FragColor = texture2D( tDiffuse, vUv );
}
次に、単純な THREE.ShaderMaterial を使用しようとしています。
var material = new THREE.ShaderMaterial( {
uniforms: { tDiffuse: { type: "t", value: outputFBO } },
//other stuff... which shaders to use etc
} );
しかし、コンソールにはエラーが表示されていませんが、メッシュは黒く表示されます。同じシェーダーとシェーダー マテリアルを使用しても、THREE.ImageUtils.loadTexture("someImageOrOther") の結果を均一としてシェーダーに提供すると、正しくレンダリングされるので、問題は FBO にあると思います。WebGL で FBO から Texture2D に変換する便利な方法はありますか?
編集:
さらに実験を重ねると、これは問題ではないように見えます。テクスチャを画面に出力するだけの別のシェーダーに FBO を渡すと、正常に表示されます。照明や法線などが原因で、マテリアルが黒く見えることはありますか?
編集2:
UV と法線は THREE から直接来ているので、そうではないと思います。問題の一部は、ほとんどのシェーダー エラーが報告されないことです。何らかの形で WebGLTexture をマッピングできれば、おそらくこのようにすべてが簡単になります
var newMaterial = new THREE.MeshLambertMaterial({ map : outputFBO.texture });
しかし、もちろんそれはうまくいきません。THREE が WebGLTextures から直接読み取ることができることを示唆するドキュメントを見つけることができませんでした。