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) offest 的情况下,我使用此代码计算我的正射投影矩阵:
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));
}
这很好用 UNTIL 我将向我的视口添加任何 (x,y) 偏移量。使用glViewport(0, m_WindowHeight/2, m_WindowWidth/2, m_WindowHeight/2
时效果如下:
和glViewport(0, 0, m_WindowWidth/2, m_WindowHeight/2)
:
我怎样才能让它发挥作用?
首先,宽高比总是width/height。
那我想你要找的是:
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;
看看这个wiki page
我找到了这个问题的解决方案并将其发布在 gamedev 论坛上:
https://gamedev.stackexchange.com/questions/122284/glviewport-offset-and-ortho-projection/122289#122289
简而言之:
我将整个场景绘制到帧缓冲区,然后将生成的纹理渲染到屏幕。此操作导致不需要的 glViewport() 转换累积。
此问题的解决方案是在渲染到帧缓冲区之前将 glViewport() 设置为原点,然后在将纹理渲染到屏幕时设置偏移量。
在我发现有关根据视口大小创建投影矩阵的所有教程中,所有教程都假定视口的左下角坐标为 (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) offest 的情况下,我使用此代码计算我的正射投影矩阵:
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));
}
这很好用 UNTIL 我将向我的视口添加任何 (x,y) 偏移量。使用glViewport(0, m_WindowHeight/2, m_WindowWidth/2, m_WindowHeight/2
时效果如下:
和glViewport(0, 0, m_WindowWidth/2, m_WindowHeight/2)
:
我怎样才能让它发挥作用?
首先,宽高比总是width/height。
那我想你要找的是:
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;
看看这个wiki page
我找到了这个问题的解决方案并将其发布在 gamedev 论坛上: https://gamedev.stackexchange.com/questions/122284/glviewport-offset-and-ortho-projection/122289#122289
简而言之: 我将整个场景绘制到帧缓冲区,然后将生成的纹理渲染到屏幕。此操作导致不需要的 glViewport() 转换累积。
此问题的解决方案是在渲染到帧缓冲区之前将 glViewport() 设置为原点,然后在将纹理渲染到屏幕时设置偏移量。