Qt 5.5 QOpenGLTexture复制数据问题

时间:2015-10-15 13:16:54

标签: c++ qt opengl qt5.5

我正在使用Qt 5.5 OpenGL包装器类。特别是试图让QOpenGLTexture正常工作。在这里,我创建一个1x1 2D白色纹理用于屏蔽目的。这有效:

void Renderer::initTextures()
{    
    QImage white(1, 1, QImage::Format_RGBA8888);
    white.fill(Qt::white);
    m_whiteTexture.reset(new QOpenGLTexture(QOpenGLTexture::Target2D));
    m_whiteTexture->setSize(1, 1);
    m_whiteTexture->setData(white);
    //m_whiteTexture->allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt32);
    //m_whiteTexture->setData(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, white.bits());

    // Print any errors
    QList<QOpenGLDebugMessage> messages = m_logger->loggedMessages();
    if (messages.size())
    {
        qDebug() << "Start of texture errors";
        foreach (const QOpenGLDebugMessage &message, messages)
            qDebug() << message;
        qDebug() << "End of texture errors";
    }
}

但是我现在正在尝试做两件事:

  1. 使用allocate + setData序列作为单独的命令(注释掉的行),例如

    m_whiteTexture->allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt32);
    m_whiteTexture->setData(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, white.bits());
    
  2. 为了更复杂的渲染,我只是更新部分数据而不是重新分配。与此相关的是(2)我想要移动到Target2DArray并在此数组中推送/弹出纹理。

    1. 创建Target2DArray纹理并使用QImages填充图层。最终,我将推送/弹出纹理达到硬件上可用的最大尺寸。
    2. 关于(1),我从QOpenGLDebugMessage记录器中得到这些错误:

      Start of texture errors
      QOpenGLDebugMessage("APISource", 1280, "Error has been generated. GL error GL_INVALID_ENUM in TextureImage2DEXT: (ID: 2663136273) non-integer <format> 0 has been provided.", "HighSeverity", "ErrorType")
      QOpenGLDebugMessage("APISource", 1280, "Error has been generated. GL error GL_INVALID_ENUM in TextureImage2DEXT: (ID: 1978056088) Generic error", "HighSeverity", "ErrorType")
      QOpenGLDebugMessage("APISource", 1281, "Error has been generated. GL error GL_INVALID_VALUE in TextureImage2DEXT: (ID: 1978056088) Generic error", "HighSeverity", "ErrorType")
      QOpenGLDebugMessage("APISource", 1281, "Error has been generated. GL error GL_INVALID_VALUE in TextureSubImage2DEXT: (ID: 1163869712) Generic error", "HighSeverity", "ErrorType")
      End of texture errors
      

      我的掩码与原始代码一起使用,但我无法在(1)和(2)场景中使用它。对于(2)我将目标更改为Target2DArray,更改大小以包括深度1,调整我的着色器以使用vec3纹理坐标和sampler3D进行采样等。如果有帮助,我可以发布更完整的(2)示例。我也不明白这些错误代码,如果出现问题,显然很难在GPU上调试。我尝试了各种PixelType和PixelFormat组合。

      谢谢!

2 个答案:

答案 0 :(得分:0)

这个问题很老,但我本人也遇到了类似的问题。对我来说,解决方案是在之前调用setFormat

m_whiteTexture->setFormat(QOpenGLTexture::RGBA8_UNorm);

答案 1 :(得分:0)

我在这里发现:https://www.khronos.org/opengl/wiki/Common_Mistakes#Creating_a_complete_texture 原始代码的问题是纹理不完整

如@flaiver所述,使用yubico-client/default.nix propagateBuildInputs = [ requests ]; ERROR: Could not find a version that satisfies the requirement requests<3.0,>=2.7 (from yubico-client==1.13.0) (from versions: none) ERROR: No matching distribution found for requests<3.0,>=2.7 (from yubico-client==1.13.0) propagatedBuildInputs = [ requests ]; $ nix-build -I nixpkgs=~/git/nixpkgs '<nixpkgs>' -k -A python37Packages.yubico-client /nix/store/0yjz8smgmjr0006nmka6wliy01z8av7m-python3.7-yubico-client-1.13.0 是有效的,但这仅是因为Qt为此纹理使用了不同类型的存储(实际上,它使用了QOpenGLTexture::RGBA8_UNorm,根据OpenGL文档,这甚至更好) ,而不是glTexStorage2D

要使纹理正常工作,即使您确实特别需要QOpenGLTexture::RGBA(或某些其他格式,例如QOpenGLTexture::RGBA),也需要为每个mipmap级别设置纹理数据(您不需要确实需要),或者禁用mipmaps:

QOpenGLTexture::AlphaFormat

在为纹理数据分配存储之后。