Я хотел бы отобразить образец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();
}