Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QGLWidget-发生失真_Qt_Opengl_Nvidia_Optix - Fatal编程技术网

Qt QGLWidget-发生失真

Qt QGLWidget-发生失真,qt,opengl,nvidia,optix,Qt,Opengl,Nvidia,Optix,我想在QGLWidget中显示OptixSDK的样本6 我的应用程序只有3个用于绕X、Y、Z轴旋转的QSlider和QGLWidget 据我所知,每当我的QSlider或Mouseevents调用updateGL()时,就会调用paintGL()。然后我初始化一个旋转矩阵,并将该矩阵应用于PinholeCamera,以便使用新变换的摄影机坐标跟踪场景,对吗 跟踪完成后,我得到outputbuffer并使用它使用glDrawPixels()绘制像素,就像OptiX框架中给出的GLUTdisplay

我想在QGLWidget中显示OptixSDK的样本6

我的应用程序只有3个用于绕X、Y、Z轴旋转的QSlider和QGLWidget

据我所知,每当我的QSlider或Mouseevents调用updateGL()时,就会调用paintGL()。然后我初始化一个旋转矩阵,并将该矩阵应用于PinholeCamera,以便使用新变换的摄影机坐标跟踪场景,对吗

跟踪完成后,我得到outputbuffer并使用它使用glDrawPixels()绘制像素,就像OptiX框架中给出的GLUTdisplay.cpp一样

但我的问题是图像是扭曲的。例如,我想显示一个球,但球已极度平坦,但旋转效果良好。 当我缩小时,图像的水平缩放速度似乎比垂直缩放慢得多

我几乎可以肯定/希望它与未正确使用的gl…()功能有关。我错过了什么?有人能帮我吗

为了完整起见,我发布了paintGL()和updateGL()代码

void MyGLWidget::initializeGL()
{
glPixelStorei(GLU解包对齐,1);
m_场景=新建MeshViewer();
m_scene->setMesh((std::string(sutilSamplesDir())+“/ball.obj”).c_str());
int缓冲区宽度、缓冲区高度;
//布景
SampleScene::InitialCameraData初始摄像机数据;
m_场景->设置UseVboBuffer(假);
m_场景->初始场景(初始摄像机数据);
int m_初始窗口宽度=400;
int m_初始窗口高度=400;
如果(m_初始窗口宽度>0和m_初始窗口高度>0)
m_场景->调整大小(m_初始窗口宽度、m_初始窗口高度);
//根据场景参数初始化摄影机
m_camera=新针孔摄像头(初始摄像头数据眼,
初始摄像机数据。观察,
初始\u摄像机\u数据。向上,
-1.0f,//hfov在使用“保持垂直”时被忽略
初始摄像机数据.vfov,
针孔虫::保持垂直);
Buffer Buffer=m_scene->getOutputBuffer();
RTsize缓冲区宽度、缓冲区高度;
缓冲区->获取大小(缓冲区宽度、缓冲区高度);
缓冲区宽度=静态转换(缓冲区宽度);
缓冲区高度=静态转换(缓冲区高度);
浮眼,U,V,W;
m_摄像头->getEyeUVW(眼睛,U,V,W);
采样场景::RaygenCamerada摄像机数据(眼睛、U、V、W);
//初步汇编
m_scene->getContext()->compile();
//加速构建
m_场景->跟踪(摄像机数据);
m_scene->getContext()->启动(0,0);
//初始化状态
glMatrixMode(GL_投影);glLoadIdentity();glOrtho(0,1,0,1,-1,1);
glMatrixMode(GL_MODELVIEW);glLoadIdentity();glViewport(0,0,缓冲区宽度,缓冲区高度);
}
这里是paintGL()

void MyGLWidget::paintGL()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glLoadIdentity();
浮眼,U,V,W;
m_摄像头->getEyeUVW(眼睛,U,V,W);
采样场景::RaygenCamerada摄像机数据(眼睛、U、V、W);
{
nvtx::ScopedRange r(“跟踪”);
m_场景->跟踪(摄像机数据);
}
//绘制结果图像
Buffer Buffer=m_scene->getOutputBuffer();
RTsize缓冲区宽度、缓冲区高度;
缓冲区->获取大小(缓冲区宽度、缓冲区高度);
int buffer\u width=静态转换(buffer\u width\u rts);
int buffer\u height=静态强制转换(buffer\u height\u rts);
RTformat buffer_format=buffer.get()->getFormat();
GLvoid*imageData=buffer->map();
断言(图像数据);
开关(缓冲区格式){
/*…设置总账数据类型和总账格式*/
}
RTsize elementSize=buffer->getElementSize();
int-align=1;
如果((elementSize%8)==0)align=8;
如果((elementSize%4)==0)align=4,则为else;
如果((elementSize%2)==0)align=2,则为else;
glPixelStorei(GL_解包_对齐,对齐);
gldata=QGLWidget::convertToGLFormat(图像数据);
NVTX_RangePushA(“glDrawPixels”);
glDrawPixels(静态投影(缓冲区宽度)、静态投影(缓冲区高度)、gl格式、gl数据类型、图像数据);
//glDraw
NVTX_RangePop();
缓冲区->取消映射();
}

经过数小时的调试,我发现我忘了正确设置相机参数,它与OpenGL的东西没有任何关系

我的U坐标,视图平面的水平轴被弄乱了,但V、W和眼睛坐标是正确的

在我在initializeGL()中添加这些行之后

一切都是对的

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); 
   }
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();
}
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 );