簡體   English   中英

從QOpenGLFramebuffer創建立方體貼圖

[英]Create Cubemap from QOpenGLFramebuffer

我想使用Qt小部件為IBL實現立方體貼圖卷積。

當實現從等角圖到立方圖的轉換時,我遇到了一個我不明白的錯誤:

這是我創建渲染緩沖區的方法:

QOpenGLFramebufferObjectFormat format;

format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setInternalTextureFormat(GL_RGBA32F_ARB);

envTarget = new QOpenGLFramebufferObject(QSize(256, 256), format);

這是我創建立方體貼圖紋理的方法:

envCubemap = new QOpenGLTexture(QOpenGLTexture::TargetCubeMap);
envCubemap->create();
envCubemap->bind();

envCubemap->setSize(256, 256, 4);
envCubemap->setFormat(QOpenGLTexture::RGBAFormat);
envCubemap->allocateStorage(QOpenGLTexture::RGB, QOpenGLTexture::Float32);
envCubemap->setMinMagFilters(QOpenGLTexture::Nearest, QOpenGLTexture::Linear);

然后,我繼續將不同的立方體貼圖視圖呈現到紋理的相應部分:

envCubemap->bind(9);

glViewport(0, 0, 256, 256);
envTarget->bind();

for (unsigned int i = 0; i < 6; ++i)
{
    ActiveScene->ActiveCamera->View = captureViews[i];
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 9, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    drawBackground();
}

envTarget->release();

drawBackground()方法繪制一個環境球,該球可以與我的默認緩沖區一起正常工作。

我得到的openGL錯誤是glFramebufferTexture2D如果我注釋掉glFramebufferTexture2D行, glFramebufferTexture2D變為0。 1282對應於GL_INVALID_OPERATIONGL_INVALID_VALUE ,根據glFramebufferTexture2D文檔,這兩者都附有多個錯誤。

我怎么了? 我嘗試遍歷每個參數以解決此錯誤,但未提出解決方案。 因為這應該是相當標准的東西,所以我希望在這里找到解決方案:D幫助?

您實際上需要告訴幀緩沖區,使用其ID而不是'9'渲染哪個紋理:

glFramebufferTexture2D(
     GL_FRAMEBUFFER,
     GL_COLOR_ATTACHMENT0,
     GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
     envCubemap->textureId(), // <--- The change
     0);

envCubemap->bind(9); ,只需刪除即可。

暫無
暫無

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

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