Qt 5.5 QOpenGLTexture复制数据问题
Qt 5.5 QOpenGLTexture copying data issue
我正在使用Qt 5.5 OpenGL包装器类。特别是试图让QOpenGLTexture工作。这里我创建了一个1x1的二维白色纹理用于遮罩。如此:
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)我想移动到target2array并在此数组中推送/弹出纹理。
- 创建Target2DArray纹理并使用QImages填充图层。最终,我将推/弹出纹理到硬件上可用的一些最大尺寸。
关于(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进行采样等。如果有帮助的话,我可以贴出一个更完整的例子。我也不理解这些错误代码,显然很难在GPU上调试,如果这就是问题所在。我已经尝试了各种PixelType和PixelFormat组合。
谢谢!
这个问题很老了,但我自己刚刚遇到了一个类似的问题。对我来说,解决方案是在
之前调用setFormatm_whiteTexture->setFormat(QOpenGLTexture::RGBA8_UNorm);
我在这里发现:https://www.khronos.org/opengl/wiki/Common_Mistakes#Creating_a_complete_texture原始代码的问题是纹理不完整。
正如@flaiver所提到的,使用QOpenGLTexture::RGBA8_UNorm
工作,但只是因为Qt使用不同类型的存储这种纹理(有效地使用glTexStorage2D
,这甚至更好,根据OpenGL文档),这不是QOpenGLTexture::RGBA
的情况。
为了使纹理工作,即使你确实需要QOpenGLTexture::RGBA
(或其他一些格式,例如QOpenGLTexture::AlphaFormat
),你需要为每个mipmap级别设置纹理数据(你并不真正需要你的情况),或者禁用使用mipmaps:
// 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);
在为纹理数据分配存储空间之后。
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- HDF5Cpp 扩展复合数据集超板问题
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 我对数据结构、双向链表有一些问题
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- Java 客户端C++服务器数据发送/接收问题
- printf 数据类型说明符复杂问题
- 从文件导入数据时遇到问题.我有一个没完没了的循环
- 对于这个问题,是否有更好的数据结构和算法选择
- 使用SSE内部函数复制少量数据时出现问题
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- 面对迭代矢量<矢量<string>>和打印数据的问题
- C++中从客户端到服务器的数据传输问题
- 将此类数据作为字符串进行比较时出现问题
- 线程清理器检测到数据争用,问题出在哪里?
- 如何解决在 clr 项目的特定文件中写入数据的问题?
- C++奇怪的问题.数据成员超出范围
- C 的多态性问题 - 数据覆盖
- 面试问题——数据结构