簡體   English   中英

使用QOpenGLTexture和QOpenGLFrameBufferObject的多重紋理

[英]Multi-texturing using QOpenGLTexture and QOpenGLFrameBufferObject

我正在嘗試將先前的項目移植到新的Qt5 OpenGL類中。 我想使用FBO渲染到紋理。 先前的代碼利用了多個紋理,這些紋理可以按需附加到FBO。 因此,我將附加一個特定的紋理對象,執行渲染,附加另一個紋理並執行不同的操作,並將輸出呈現到新附加的紋理上,依此類推。

我想知道如何使用Qt5 OpenGL類進行此操作。 例如,我不知道如何將某個QOpenGLTexture對象附加到QOpenGLFrameBufferObject以便可以對其進行渲染。 我可以看到有一個texture()方法和一個takeTexture()方法。 但是它們都只返回紋理ID。 另外,如何更改活動紋理單位? 例如,我想從我的着色器程序中的兩個紋理中采樣。 因此,我需要將兩個紋理綁定到不同的紋理單元。

需要澄清的是,新API的主要問題在於,我在QOpenGLFrameBufferObject不到任何會返回QOpenGLTexture對象的方法。 只有toImage()方法, texture()takeTexture()方法。 我想我可以使用從toImage()返回的QImage構造QOpenGLTexture 但是我不確定這是否有效。

至於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

等等

我向Qt bugtracker添加了功能請求,以支持QOpenGLFramebufferObject的多個渲染目標(MRT)。 目前正在進行中,似乎只有代碼審查處於待處理狀態。

https://bugreports.qt.io/browse/QTBUG-39235

因此,請繼續關注未來Qt版本的更改日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM