[英]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.