QGLWidgetを使用して、QT を使用して Coin3D/Open Inventor シーンを表示しようとしています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: バッファーに実際にシーンが含まれていることを確認するために、バッファーの内容を 2 つのファイルに書き込みます。たとえば、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、2 番目の形式は GL_RGBA です。ただし、立方体はまだ完全に黒です。
e4: 私のシーンではエラーでした。残りを追加する前に、特にカメラを追加する前にライトを追加する必要があります。
OpenGL で QImage を描画する方法を見つけました。このスレッドを参照してください。そのため、バッファまたはその変換に問題があるようです。