【问题标题】:Display OptiX sample6 in QGLWidget在 QGLWidget 中显示 OptiX sample6
【发布时间】:2015-05-14 10:52:37
【问题描述】:

我想在 QGLWidget 中显示 OptixSDK 的 sample6。

我已经阅读了Nvidia OptiX Forum 中的主题,但我没有继续前进,因为不幸的是我不知道如何覆盖 paintGL() 方法。

起初我只是尝试读取 sample6 的输出缓冲区并将其保存在 QImage 中

QImage img(m_width,m_height,QImage::Format_RGB32);
QColor color;
int idx;
void* data = m_outputBuffer->map();
typedef struct { float r; float g; float b; float a;} rgb;
rgb* rgb_data = (rgb*)data;

for(unsigned int i=0; i<m_width*m_height; ++i){
    std::cout<<rgb_data[i].r<<","<<rgb_data[i].g<<","<<rgb_data[i].b<<std::endl;
    float red = rgb_data[i].r; if(red>1.0) red=1.0;
    float green = rgb_data[i].g; if(green>1.0) green=1.0;
    float blue = rgb_data[i].b; if(blue>1.0) blue=1.0;
    float alpha = rgb_data[i].a; if(alpha>1.0) alpha=1.0;
    color.setRgbF(red,green,blue,alpha);
    idx = floor((float)i/m_height);

    img.setPixel(i-(idx*m_height), idx, color.rgb());

}
m_outputBuffer->unmap();
img.save("optixSampleSix.png","PNG");

Nvidia OptiX Forum中提到的bei RoboMod的方法,但在两者中我都得到了一张废话的黑色图片。不过,如果我使用 sutil 提供的函数将输出保存在 .ppm 文件中,一切似乎都是正确的。

所以我的问题是如何正确地从 OptiX 输出缓冲区到渲染的 openGL 场景。

【问题讨论】:

    标签: qt opengl nvidia optix


    【解决方案1】:

    直接构造QImage怎么样?

    uchar* data = (uchar *)m_outputBuffer->map();
    QImage img(data, m_width, m_height, QImage::Format_ARGB32);
    // or maybe Format_RGBA8888 would work for you.. you have to check docs 
    m_outputBuffer->unmap();
    img.save("optixSampleSix.png","PNG");
    

    【讨论】:

    • 通过直接构造 QImage 和你的 QImage::Format_ARGB32 ,我得到了正确的结果。
    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多