使用透视矩阵使用OpenGL渲染二维数据时的伪影

使用透视矩阵使用OpenGL渲染二维数据时的伪影,opengl,Opengl,下面这条线延伸了无限的距离,这就是神器。预期的是一条连接两个椭圆的线: 我已经检查了手动加载到VBO中的数据,用于表示直线的点位于中间椭圆的中心和底部椭圆的中心。绘图代码如下所示 m_shaderManager->useProgram(m_handle); glBindBuffer(GL_ARRAY_BUFFER, m_vbo); GL_CALL m_shaderManager->enableVertexAttribArrays(m_handle, m_shaderVertexAt

下面这条线延伸了无限的距离,这就是神器。预期的是一条连接两个椭圆的线:

我已经检查了手动加载到VBO中的数据,用于表示直线的点位于中间椭圆的中心和底部椭圆的中心。绘图代码如下所示

m_shaderManager->useProgram(m_handle);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); GL_CALL
m_shaderManager->enableVertexAttribArrays(m_handle, m_shaderVertexAttrib);
m_shaderManager->setUniformMatrix4X4(m_handle, m_mvp.to_gl_matrix(), "uMVP");
glDrawArrays(GL_LINE_STRIP, 0, m_vertexAttrib.get_attribute_count()); GL_CALL
  • 调用get_attribute_count()将按预期返回2
  • m_mvp是身份矩阵
  • 我的问题不是代码中的问题在哪里。有很多代码需要筛选。相反,我的问题是调试应该从哪里开始?我以前用这段代码画过简单的线条,并且检查过原始数据。还有什么其他类型的事情可能导致这种行为


    根据要求,这是调试时我正在查看的一个地方:

    您告诉自己的
    m_mvp
    是标识,因此我猜顶点着色器中的输入与输出相同(至少是顶点位置)。如果您在着色器中放置的两个点是两个可见向量:
    [0 0]
    [3.5e-8,-3,0]
    ,那么您的输出看起来就像现在这样就不足为奇了<代码>[0 0]是线路开始时屏幕的中心,并且
    [3.5e-8,-3,0]
    在y方向位于屏幕外-2处(在可见区域下方)。屏幕上的所有可见顶点在每个维度(标准化设备坐标)的范围
    [-1 | 1]

    这看起来像是混合了一些ui元素和openGL渲染。到目前为止,我不明白什么是从opengl绘制的,什么是小部件的覆盖。OpenGL视口在哪里?您知道吗,如果您进行二维渲染,您不需要任何投影矩阵?@KenSlade拍摄了一些屏幕截图。@Arne如果您使用正射项目,您不需要投影矩阵。然而,我允许用户放大和缩小。我觉得透视矩阵更适合这种情况。我也觉得这张图片足够清楚地描述了这个问题。否决票的原因?应该被抓住。我忘了做的是取样条线的变换,然后乘以(proj*view)矩阵。