- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一段时间以来,我一直在 QOpenGLTexture 的纹理中使用 32 位浮点精度的 RGB 图像。我没有遇到任何问题。最初,这些图像具有无符号短数据类型,我想保留此数据类型以将数据发送到 openGL(顺便说一句,这样做实际上是否节省了一些内存?)。经过多次尝试,我无法让 QOpenGLTexture 显示图像。我最终得到的只是一张黑色图像。下面是我如何设置 QOpenGLTexture。使用 float 且到目前为止有效的部分已被注释掉。假定图像为 16 位无符号整数的部分位于后者的正下方,未注释。我在带有 Iris 图形的 macbook pro 视网膜上使用 OpenGL 3.3、GLSL 330、核心配置文件。
QOpenGLTexture *oglt = new QOpenGLTexture(QOpenGLTexture::Target2D);
oglt->setMinificationFilter(QOpenGLTexture::NearestMipMapNearest);
oglt->setMagnificationFilter(QOpenGLTexture::NearestMipMapNearest);
//oglt->setFormat(QOpenGLTexture::RGB32F); // works
oglt->setFormat(QOpenGLTexture::RGB16U);
oglt->setSize(naxis1, naxis2);
oglt->setMipLevels(10);
//oglt->allocateStorage(QOpenGLTexture::RGB, QOpenGLTexture::Float32); // works
//oglt->setData(QOpenGLTexture::RGB, QOpenGLTexture::Float32, tempImageRGB.data); // works
oglt->allocateStorage(QOpenGLTexture::RGB_Integer, QOpenGLTexture::UInt16);
oglt->setData(QOpenGLTexture::RGB_Integer, QOpenGLTexture::UInt16, tempImageRGB.data);
那么,就以上这些行,有什么问题吗?当我使用 UInt16
时,我在 tempImageRGB.data
中的数据在 [0-65535] 之间。当我使用 QOpenGLTexture::Float32 时,tempImageRGB.data
中的值已经标准化,因此它们将在 [0-1] 范围内。
然后,这是我的片段着色器:
#version 330 core
in mediump vec2 TexCoord;
out vec4 color;
uniform mediump sampler2D ourTexture;
void main()
{
mediump vec3 textureColor = texture(ourTexture, TexCoord).rgb;
color = vec4(textureColor, 1.0);
}
我错过了什么?
最佳答案
我似乎通过不使用 NearestMipMapNearest
来解决这个问题。如果我只将它用于缩小,事情就会奏效。虽然总的来说这是有道理的,但我不明白为什么在浮点情况下使用 NearestMipMapNearest
进行放大和缩小时没有问题。
因此,代码只需将着色器中的“sampler2D”更改为“usampler2D”,将“setMagnificationFilter(QOpenGLTexture::NearestMipMapNearest)”更改为“setMagnificationFilter(QOpenGLTexture::Nearest)”即可工作。缩小过滤器不需要更改。此外,尽管它可以使用和不使用,但我不需要显式设置 MipMapLevels,所以我可以删除 oglt->setMipLevels(10)
。
为了清楚起见,这里是更正后的代码:
QOpenGLTexture *oglt = new QOpenGLTexture(QOpenGLTexture::Target2D);
oglt->setMinificationFilter(QOpenGLTexture::NearestMipMapNearest);
oglt->setMagnificationFilter(QOpenGLTexture::Nearest);
//oglt->setFormat(QOpenGLTexture::RGB32F); // works
oglt->setFormat(QOpenGLTexture::RGB16U); // now works with integer images (unsigned)
oglt->setSize(naxis1, naxis2);
//oglt->allocateStorage(QOpenGLTexture::RGB, QOpenGLTexture::Float32); // works
//oglt->setData(QOpenGLTexture::RGB, QOpenGLTexture::Float32, tempImageRGB.data); // works
oglt->allocateStorage(QOpenGLTexture::RGB_Integer, QOpenGLTexture::UInt16); // now works with integer images (unsigned)
oglt->setData(QOpenGLTexture::RGB_Integer, QOpenGLTexture::UInt16, tempImageRGB.data); // now works with integer images (unsigned)
片段着色器变得简单:
#version 330 core
in mediump vec2 TexCoord;
out vec4 color;
uniform mediump usampler2D ourTexture;
void main()
{
mediump vec3 textureColor = texture(ourTexture, TexCoord).rgb;
color = vec4(textureColor, 1.0);
}
关于c++ - Qt 5 与 QOpenGLTexture 和 16 位整数图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35705682/
我正在尝试调整 QOpenGLTextures 的大小以保留指定的属性。我知道在可能的情况下使用不可变存储这一事实。所以我必须破坏并重新创建纹理。但似乎 QOpenGLTexture 在销毁后失去了它
我一直在使用旧的 Qt OpenGl 方法,但现在是时候切换到较新的方法了。 作为位图 FIBITMAP* 正确初始化 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
我正在使用 Qt 5.5 OpenGL 包装类。特别是试图让 QOpenGLTexture 工作。我在这里创建一个 1x1 2D 白色纹理用于 mask 目的。这有效: void Renderer::
我正在尝试将以前的项目移植到新的 Qt5 OpenGL 类中。我想使用 FBO 渲染到纹理。之前的代码使用了多个纹理,我按需将其附加到 FBO。因此,我会附加一个特定的纹理对象,执行渲染,附加另一个纹
一段时间以来,我一直在 QOpenGLTexture 的纹理中使用 32 位浮点精度的 RGB 图像。我没有遇到任何问题。最初,这些图像具有无符号短数据类型,我想保留此数据类型以将数据发送到 open
我是一名优秀的程序员,十分优秀!