首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT5.5 QOpenGLTexture复制数据问题

QT5.5 QOpenGLTexture复制数据问题
EN

Stack Overflow用户
提问于 2015-10-15 13:16:53
回答 2查看 2.1K关注 0票数 4

我正在使用QT5.5 OpenGL包装器类。特别是要让QOpenGLTexture正常工作。这里,我创建了一个1x12D白色纹理掩蔽的目的。这样做是可行的:

代码语言:javascript
复制
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. 使用分配+ setData序列作为单独的命令(注释行)。 m_whiteTexture->allocateStorage(QOpenGLTexture::RGBA,QOpenGLTexture::UInt8 32);m_whiteTexture->setData(QOpenGLTexture::RGBA,QOpenGLTexture::UInt8 8,white.bits();

为了以后更复杂的呈现,我只是更新部分数据,而不是重新分配。与此相关的是(2),我想移到这个数组中的Target2DArray和push/pop纹理。

  1. 创建Target2DArray纹理并使用QImages填充层。最终,我将推动/弹出式纹理达到一些最大的尺寸上的硬件。

关于(1),我从QOpenGLDebugMessage记录器获得以下错误:

代码语言:javascript
复制
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组合。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-04-07 11:35:41

这个问题很老,但我自己也遇到了一个类似的问题。对我来说,解决方案是在之前打电话给setFormat

代码语言:javascript
复制
m_whiteTexture->setFormat(QOpenGLTexture::RGBA8_UNorm);
票数 0
EN

Stack Overflow用户

发布于 2020-11-14 14:12:30

正如我在这里发现的:texture原始代码的问题是纹理不完整。

正如@flaiver所提到的,使用QOpenGLTexture::RGBA8_UNorm是可行的,但这仅仅是因为Qt使用了不同类型的存储来处理这个纹理(实际上它使用了glTexStorage2D,甚至更好,正如OpenGL文档所示),而QOpenGLTexture::RGBA则不是这样。

要使纹理工作,即使您确实需要特定的QOpenGLTexture::RGBA (或其他一些格式,例如QOpenGLTexture::AlphaFormat),您也需要为每个mipmap级别设置纹理数据(对于您的情况并不真正需要),或者禁用使用mipmap:

代码语言:javascript
复制
// the default is `QOpenGLTexture::NearestMipMapLinear`/`GL_NEAREST_MIPMAP_LINEAR`,
// but it doesn't work, if you set data only for level 0
// alternatively use QOpenGLTexture::Nearest if that suits your needs better
m_whiteTexture->setMagnificationFilter(QOpenGLTexture::Linear);
m_whiteTexture->setMinificationFilter(QOpenGLTexture::Linear);

// // optionally a good practice is to explicitly set the Wrap Mode:
// m_whiteTexture->setWrapMode(QOpenGLTexture::ClampToEdge);

就在您为纹理数据分配存储空间之后。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33149607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档