繁体   English   中英

glViewport偏移和正投影

[英]glViewport offset and ortho projection

在所有教程中,我发现都是基于视口大小创建投影矩阵的,所有这些教程都假定视口的左下角坐标为(0,0)。

现在,我想绘制屏幕的不同部分,为此,我想相应地切换视口:

glViewport(0,0,windowWidth/2, windowHeight/2); //left bottom
glViewport(0,windowHeight/2,windowWidth/2, windowHeight/2);//left top
glViewport(windowWidth/2,0,windowWidth/2, windowHeight/2);//right bottom
glViewport(windowWidth/2, windowHeight/2,windowWidth/2, windowHeight/2);//right top

现在,我在定义投影矩阵时遇到了问题。 在没有任何(x,y)影响的情况下,我使用以下代码来计算正交投影矩阵:

if (m_WindowWidth > m_WindowHeight)
{
    auto viewportAspectRatio = (float)m_WindowWidth / (float)m_WindowHeight;

    m_ProjectionMatrix.m_fLeft = (-1.0f) * m_fWindowSize * viewportAspectRatio;
    m_ProjectionMatrix.m_fRight = m_fWindowSize * viewportAspectRatio;
    m_ProjectionMatrix.m_fBottom = (-1.0f)*m_fWindowSize;
    m_ProjectionMatrix.m_fTop = m_fWindowSize;
    m_ProjectionMatrix.m_fNear = -(10.0f)*m_fWindowSize;
    m_ProjectionMatrix.m_fFar = (10.0f)*m_fWindowSize;

    m_fMoveSpeed = static_cast<GLfloat>(m_fWindowSize * 2 / static_cast<float>(m_WindowHeight));
}
else
{
    auto viewportAspectRatio = (float)m_WindowHeight / (float)m_WindowWidth;

    m_ProjectionMatrix.m_fLeft = (-1.0f)*m_fWindowSize;
    m_ProjectionMatrix.m_fRight = m_fWindowSize;
    m_ProjectionMatrix.m_fBottom = (-1.0f)*m_fWindowSize * viewportAspectRatio;
    m_ProjectionMatrix.m_fTop = m_fWindowSize * viewportAspectRatio;
    m_ProjectionMatrix.m_fNear = -(10.0f)*m_fWindowSize;
    m_ProjectionMatrix.m_fFar = (10.0f)*m_fWindowSize;

    m_fMoveSpeed = static_cast<GLfloat>(m_fWindowSize * 2 / static_cast<float>(m_WindowWidth));
}

直到我将所有(x,y)偏移添加到视口中时,此方法都可以正常工作。 使用glViewport(0, m_WindowHeight/2, m_WindowWidth/2, m_WindowHeight/2 )时,效果如下:

glViewport(0,m_WindowHeight / 2,m_WindowWidth / 2,m_WindowHeight / 2)

并使用glViewport(0, 0, m_WindowWidth/2, m_WindowHeight/2) glViewport(0,0,m_WindowWidth / 2,m_WindowHeight / 2)

我该如何运作?

首先,长宽比始终是宽度/高度。

然后,我认为您正在寻找的是:

m_ProjectionMatrix.m_fLeft = x;
m_ProjectionMatrix.m_fRight = x + m_WindowWidth;
m_ProjectionMatrix.m_fBottom = y;
m_ProjectionMatrix.m_fTop = y + m_WindowHeight;
m_ProjectionMatrix.m_fNear = -(10.0f)*m_fWindowSize;
m_ProjectionMatrix.m_fFar = (10.0f)*m_fWindowSize;

看看这个维基页面

我找到了解决此问题的方法并将其发布在gamedev论坛上: https ://gamedev.stackexchange.com/questions/122284/glviewport-offset-and-ortho-projection/122289#122289

简而言之:我将整个场景绘制到帧缓冲区,然后将生成的纹理渲染到屏幕。 此操作导致不必要的glViewport()转换累积。

解决方案是将glViewport()设置为在渲染到帧缓冲区之前开始,然后在将纹理渲染到屏幕时设置偏移量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM