2015-05-20 20 views
4

Я хотел бы отобразить образец6 OptixSDK в QGLWidget.QGLWidget - искажение произошло

Мое приложение имеет только 3 QSlider для вращения вокруг оси X, Y, Z и QGLWidget.

Для моего понимания, paintGL() вызывается всякий раз, когда updateGL() называется мой QSlider или Mouseevents. Затем я инициализирую матрицу вращения и применил эту матрицу к PinholeCamera, чтобы проследить сцену с новыми преобразованными камерами, верно?

Когда трассировка закончена я получаю OUTPUTBUFFER и использовать его рисовать пиксели с glDrawPixels(), так же, как в GLUTdisplay.cpp данных в рамках OptiX.

Но моя проблема в том, что изображение искажено/искажено. Например, я хотел отобразить мяч, но мяч экстремально плоский, но вращение отлично работает. Когда я увеличиваю масштаб изображения, кажется, что изображение масштабируется гораздо медленнее горизонтально, чем вертикально.

Я почти уверен/надеюсь, что он должен что-то сделать с функциями gl ...(), которые не используются должным образом. Что мне не хватает? Кто-нибудь может мне помочь?

Для полноты я после моего paintGL() и updateGL() код.

void MyGLWidget::initializeGL() 
{ 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
m_scene = new MeshViewer(); 
m_scene->setMesh((std::string(sutilSamplesDir()) + "/ball.obj").c_str());         
int buffer_width, buffer_height; 
    // Set up scene 
    SampleScene::InitialCameraData initial_camera_data; 
    m_scene->setUseVBOBuffer(false); 
    m_scene->initScene(initial_camera_data); 
    int m_initial_window_width = 400; 
    int m_initial_window_height = 400; 

    if(m_initial_window_width > 0 && m_initial_window_height > 0) 
     m_scene->resize(m_initial_window_width, m_initial_window_height); 

    // Initialize camera according to scene params 
    m_camera = new PinholeCamera(initial_camera_data.eye, 
            initial_camera_data.lookat, 
            initial_camera_data.up, 
            -1.0f, // hfov is ignored when using keep vertical 
            initial_camera_data.vfov, 
            PinholeCamera::KeepVertical); 

    Buffer buffer = m_scene->getOutputBuffer(); 
    RTsize buffer_width_rts, buffer_height_rts; 
    buffer->getSize(buffer_width_rts, buffer_height_rts); 

    buffer_width = static_cast<int>(buffer_width_rts); 
    buffer_height = static_cast<int>(buffer_height_rts); 

    float3 eye, U, V, W; 
    m_camera->getEyeUVW(eye, U, V, W); 
    SampleScene::RayGenCameraData camera_data(eye, U, V, W); 

    // Initial compilation 
    m_scene->getContext()->compile(); 
    // Accel build 
    m_scene->trace(camera_data); 
    m_scene->getContext()->launch(0, 0); 

    // Initialize state 
    glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(0, 1, 0, 1, -1, 1); 
    glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glViewport(0, 0, buffer_width, buffer_height); 
    } 

А вот paintGL()

void MyGLWidget::paintGL() 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
    float3 eye, U, V, W; 
    m_camera->getEyeUVW(eye, U, V, W); 
    SampleScene::RayGenCameraData camera_data(eye, U, V, W); 

    { 
     nvtx::ScopedRange r("trace"); 
     m_scene->trace(camera_data); 
    } 
    // Draw the resulting image 
    Buffer buffer = m_scene->getOutputBuffer(); 
    RTsize buffer_width_rts, buffer_height_rts; 
    buffer->getSize(buffer_width_rts, buffer_height_rts); 
    int buffer_width = static_cast<int>(buffer_width_rts); 
    int buffer_height = static_cast<int>(buffer_height_rts); 
    RTformat buffer_format = buffer.get()->getFormat(); 

    GLvoid* imageData = buffer->map(); 
    assert(imageData); 
    switch (buffer_format) { 
    /*... set gl_data_type and gl_format ...*/ 
    } 

    RTsize elementSize = buffer->getElementSize(); 
    int align = 1; 
    if  ((elementSize % 8) == 0) align = 8; 
    else if ((elementSize % 4) == 0) align = 4; 
    else if ((elementSize % 2) == 0) align = 2; 
    glPixelStorei(GL_UNPACK_ALIGNMENT, align); 

    gldata = QGLWidget::convertToGLFormat(image_data); 

    NVTX_RangePushA("glDrawPixels"); 
    glDrawPixels(static_cast<GLsizei>(buffer_width), static_cast<GLsizei>(buffer_height),gl_format, gl_data_type, imageData); 
    // glDraw 
    NVTX_RangePop(); 
    buffer->unmap(); 
} 

ответ

1

После нескольких часов отладки, я обнаружил, что я забыл установить камеры-параметры правильно, у него не было ничего, чтобы пойти с OpenGL вещи.

Моя U-координата, горизонтальная ось плоскости обзора была испорчена, но координаты V, W и глаза были правильными.

После того как я добавил эти строки в initializeGL()

m_camera->setParameters(initial_camera_data.eye, 
         initial_camera_data.lookat, 
         initial_camera_data.up, 
         initial_camera_data.vfov, 
         initial_camera_data.vfov, 
         PinholeCamera::KeepVertical); 

все было правильно.

Смежные вопросы