我正在使用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";
}
}
但是我现在正在尝试做两件事:
使用allocate + setData序列作为单独的命令(注释掉的行),例如
m_whiteTexture->allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt32);
m_whiteTexture->setData(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, white.bits());
为了更复杂的渲染,我只是更新部分数据而不是重新分配。与此相关的是(2)我想要移动到Target2DArray并在此数组中推送/弹出纹理。
关于(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组合。
谢谢!
答案 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
在为纹理数据分配存储之后。