glTexSubImage3D vs QOpenGLTexture setData

Posted

技术标签:

【中文标题】glTexSubImage3D vs QOpenGLTexture setData【英文标题】: 【发布时间】:2018-03-13 18:05:17 【问题描述】:

据我了解,在纹理数组或 3D 纹理的情况下,QOpenGLTexture::setData 等效于 glTexImage3D。现在如果我想在运行时使用 PBO 来更新纹理,我需要使用 glTexSubImage3D 而不是 glTexImage3D,那么 Qt 纹理中的等价物是什么?

【问题讨论】:

【参考方案1】:

首先,asynchronous uploads 绝不要求使用glTexSubImage3D;他们为any pixel transfer function.工作

第二,setData相当于SubImage-class的OpenGL函数。或者至少,most overloads 的 setData 是; one that takes a MipMapGeneration flag 将为您分配存储空间(因为 Qt 的 OpenGL 抽象是一致性消失的地方)。因此,您可以通过 setData 很好地使用 PBO。

OpenGL 中的纹理很像指针。 allocateStorage 就像分配内存并将分配的内存存储在指针中(int *p = new int[20];)。 setData 就像访问分配的对象并将数据复制到其中(p[0] = 5;)。您必须先分配内存,然后才能将内容存储到其中,但您不需要在之前分配内存之后再次

【讨论】:

因为我有一个数组纹理,所以我使用这个: void QOpenGLTexture::setData(int mipLevel, int layer, PixelFormat sourceFormat, PixelType sourceType, const void *data, const QOpenGLPixelTransferOptions * const options = Q_NULLPTR),所以从你所说的每次我想将像素从 PBO 转移到纹理时,我都需要调用 allocateStorage 对吗? @user3178756:不。确实,the documentation 明确表示您不能在同一纹理上两次调用allocateStorage。我想说的是它需要在setData 之前被调用,而不是setDataallocateStorage 之间应该存在1:1 映射。 谢谢!我还有另一个相关问题: GLubyte* ptr = (GLubyte*)m_vPUBONNZ[m_iPBONextIndx]->map(QOpenGLBuffer::WriteOnly);我的纹理是 QOpenGLTexture::UInt16,如果我使用 GLubyte 以外的任何东西,我会在渲染过程中遇到分段错误,为什么在 PBO 映射过程中我不能投射到其他任何东西(如 GLushort)?如何为 PBO 指定数据类型? @user3178756:我不知道;您没有发布所有相关代码。但是我已经回答了您当前的问题;如果你有另一个,你应该问那个。

以上是关于glTexSubImage3D vs QOpenGLTexture setData的主要内容,如果未能解决你的问题,请参考以下文章

通过 glTexSubImage3d 上传纹理数据时,像素传输格式可以改变吗?

Spyder启动黑屏,终端显示QOpenGLShaderProgram::uniformLocation(qt_Matrix): shader program is not linked QOpenG

Opengl Array Texture,适用于原始数据,但不适用于图像数据

Java世界中的类vs包vs模块vs组件vs容器vs服务vs平台[关闭]

VS2005和VS2008做的项目有啥区别

性能测试 - 响应 vs 延迟 vs 吞吐量 vs 负载 vs 扩展性 vs 压力 vs 健壮性