我正在尝试使用 QT 在 a 中显示 Coin3D/Open Inventor 场景,QGLWidget
我SoOffscreenRenderer
需要帮助将其转换为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;
}
这是正确的方法吗?
正如这个关于绘制 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:这是我的场景中的一个错误,您必须在添加其余部分之前添加灯光,尤其是在添加相机之前。
我想出了如何使用 OpenGL 绘制 QImage,请参阅此线程。所以缓冲区或它的转换似乎有问题。