一段时间以来,我一直在使用QOpenGLTexture在纹理中使用32位浮点精度的RGB图像。我没有问题。
最初,这些图像具有无符号的短数据类型,我想保留此数据类型以将数据发送到openGL(BTW,这样做是否确实节省了一些内存?)。经过多次尝试,我无法使QOpenGLTexture显示图像。我最后得到的只是一张黑色图像。
下面是我设置QOpenGLTexture的方法。注释掉了使用浮点的部分,并且到目前为止有效。假定图像为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);
因此,仅在上面这些行中,出问题了吗?
使用
tempImageRGB.data
时,我在UInt16
中的数据在[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++ - 具有QOpenGLTexture和16位整数图像的Qt 5,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35705682/