【发布时间】:2016-02-26 19:29:15
【问题描述】:
我正在尝试使用 SoOffscreenRenderer 在 QGLWidget 中显示带有 QT 的 Coin3D/Open Inventor 场景,我需要帮助将其转换为 QImage
到目前为止,我尝试的是将场景渲染到 SoOffscreenRenderer 并像这样获取缓冲区:
unsigned char * getCoinCubeImgBuffer(){
// [...] create the scene, add lightning and camera
SoOffscreenRenderer offscreenRenderer(vpRegion);
offscreenRenderer.setComponents(
SoOffscreenRenderer::Components::RGB_TRANSPARENCY
);
SbBool ok = offscreenRenderer.render(root);
// to be sure that something is actually rendered
// save the buffer content to a file
SbBool ok = offscreenRenderer.render(root);
qDebug() << "SbBool ok?" << ok;
qDebug() << "wasFileWrittenRGB" <<
offscreenRenderer.writeToRGB("C:/test-gl.rgb");
qDebug() << "wasFileWrittenPS" <<
offscreenRenderer.writeToPostScript("C:/test-gl.ps");
unsigned char * imgbuffer = offscreenRenderer.getBuffer();
return imgbuffer;
}
然后从缓冲区数据中创建一个QImage:
QImage convertImgBuffer(){
unsigned char *const imgBuffer = getCoinCubeImgBuffer();
QImage img(imgBuffer, windowWidth, windowHeight, QImage::Format_ARGB32);
// Important!
img = img.rgbSwapped();
QImage imgGL = convertToGLFormat(img);
return imgGL;
}
这是正确的做法吗?
如this question about drawing a QImage中所述,如果来源是图片,我可以绘制它。
e:为了确保我的缓冲区确实包含一个场景,我将缓冲区内容写入两个文件。例如,您可以使用 IrfanView 及其插件查看 .rgb 和 .ps 文件。
e2:刚刚想通了,我必须使用img.rgbSwapped()。现在它显示了黑白且没有闪电的场景。我会进一步调查。
e3:使用这样的代码,你需要以这种方式调整OpenGL调用以进行彩色渲染
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex.width(),
tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
第一种格式是 GL_RGB,第二种是 GL_RGBA。立方体仍然是全黑的。
e4:这是我的场景中的一个错误,您必须在添加其余部分之前添加灯光,尤其是在添加相机之前。
所以现在我既可以使用 `QGLWidget` 的函数,如`bindTexture()`,也可以使用直接的 OpenGL 调用,但我不确定具体如何。如果有人能把我推向正确的方向,那就太好了。 我不能像这样使用OpenGL吗? glEnable(GL_TEXTURE_2D); glGenTextures(1, &offscreenBufferTexture); glBindTexture(GL_TEXTURE_2D, offscreenBufferTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgGL.width(), imgGL.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, imgGL.bits()); 或者也许是`glDrawPixels()`? glDrawPixels(imgGL.width(), imgGL.height(), GL_RGBA, GL_UNSIGNED_BYTE,imgGL.bits());
我想出了如何使用 OpenGL 绘制 QImage,请参阅 this thread。所以似乎是缓冲区或它的转换有问题。
【问题讨论】:
标签: c++ qt opengl openinventor