QopEnglTextureとQopEnglFrameBufferObjectを使用したマルチテクスチャリング
質問
前のプロジェクトを新しいQT5 OpenGLクラスに移植しようとしています。 FBOを使ってテクスチャにレンダリングしたいです。前のコードは、私がFBOオンデマンドに添付されている複数のテクスチャを使用しました。そのため、特定のテクスチャオブジェクトを接続し、レンダリングを実行し、別のテクスチャを接続して別のテクスチャを接続し、出力を新しく接続されたテクスチャにレンダリングします。
私はQT5 OpenGLクラスを使ってこれをやっているのでしょうか。たとえば、特定のQOpenGLTexture
オブジェクトをQOpenGLFrameBufferObject
に添付する方法を理解できます。 texture()
メソッドとtakeTexture()
メソッドがあることがわかります。しかし、彼らは両方ともテクスチャIDを返します。また、アクティブなテクスチャユニットを変更できますか?たとえば、シェーダプログラムの2つのテクスチャからサンプルします。だから、私は2つのテクスチャをさまざまなテクスチャ単位にバインドする必要があります。
明確にするために、私が新しいAPIを持っているメインの問題は、QOpenGLFrameBufferObject
オブジェクトを返すQOpenGLTexture
のメソッドが表示されないことです。 toImage()
メソッドとtexture()
メソッドとtakeTexture()
メソッドだけがあります。 QOpenGLTexture
から返されたQImage
を使用してtoImage()
を構築するだけだと思います。しかし、それが効率的になるかどうかわかりません。
texture()
とtakeTexture()
は、新しいクラスを使用してそのリターン値を使用できる方法はわかりません。
解決
はい、QopEnglFrameBufferObject QopEnglTextureとそのように、QopEnglTextureを使用または公開しません。それは追加されるべきですが、実際には、複数の添付ファイルをサポートするようにQopenglfboを書き直す必要があります。
これとは別に、GLコールを手動で使用するのかという問題は何ですか?
GLuint textureId = fbo->texture();
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, textureId);
glActiveTexture(GL_TEXTURE9);
glBindTexture(GL_TEXTURE_3D, anotherTexture);
QOpenGLTexture *yetAnother = getTexture();
yetAnother->bind(2);
program->setUniformValue("samplerForTheFBOTexture", GL_TEXTURE4 - GL_TEXTURE0);
program->setUniformValue("my3dSampler", GL_TEXTURE9 - GL_TEXTURE0);
program->setUniformValue("anotherSampler", 2);
// or use layout (binding = ) in GLSL
.
ETC。
他のヒント
I added a feature request to the Qt bugtracker to support multiple render targets (MRT) for the QOpenGLFramebufferObject. It is currently in progress and it seems only the code review is pending.
https://bugreports.qt.io/browse/QTBUG-39235
So stay tuned for change logs of future Qt versions.