0

我正在使用 QT 在 Unix 中工作,我正在尝试创建一个位图(QGLWidget 或 QGLPixelBuffer 类)以使用 OpenGL 进行渲染。我需要使用颜色索引模式,所以当我创建位图时,我声明了这个 qglformat:

qglformat.setDirectRendering(true);
qglformat.setRgba(false); // COLOR INDEX MODE
qglformat.setDepth(true);
qglformat.setOverlay(false);
qglformat.setDepthBufferSize(16);

然后我创建位图:

QGL小部件:

m_qglwiget = new QGLWidget(qglformat);
m_qglwiget->setGeometry(0,0,m_iW,m_iH);

QGL像素缓冲区:

m_pB = new QGLPixelBuffer(m_iW,m_iH,qglformat);

在第一种情况下,小部件已创建,但如果我查看它是否有效,则函数 isValid() 返回“false”。并且执行因该错误而中止:QGLContext::makeCurrent(): Cannot make invalid context current。因为上下文也是无效的。

否则,在第二种情况下,PixelBuffer 被正确创建,但它已自动将索引颜色模式更改为 RGB 模式。

相同的程序在使用 Windows 的同一台计算机上运行,​​因此不是显卡的问题。

您能告诉我如何正确定义位图以便能够以颜色索引模式进行渲染吗?

4

1 回答 1

1

我需要使用颜色索引模式

为什么?老实说为什么?

颜色索引模式使用起来很糟糕,而且1998 年之后构建的没有(!) GPU 实际上支持它!此外,现代版本的 OpenGL 中也删除了颜色索引模式。

只是。不。利用。它!

对于 OpenGL-1.4 及更早版本,请假装它不存在。

如果要创建颜色索引像素图,请将其渲染为 RGB,然后将其转换为索引模式。

相同的程序在使用 Windows 的同一台计算机上运行,​​因此不是显卡的问题。

原因不是 GPU,而是自 1996 年以来随 Windows 一起提供的软件仿真也实现了颜色索引模式。如果 GPU 不支持请求的像素格式,但软件仿真支持,它将默默地进入软件仿真模式。

PixelBuffer 已正确创建,但已将索引颜色模式自动更改为 RGB 模式。

大多数(今天所有)GPU 都支持 PBuffer,但 Windows 的软件仿真不支持。因此,通过请求 PBuffer,唯一可以满足此请求的像素格式将是 RGB。

于 2013-10-01T19:59:38.397 回答