質問

前のプロジェクトを新しい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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top