2016-06-01 6 views
0

すべてのチュートリアルでは、ビューポートのサイズに基づいて投影行列を作成することで、すべてビューポートの左下座標が(0,0)と仮定していました。glViewportオフセットとオルソプロジェクション

今私は、画面の別の部分に描きたいと、その目的のために、私はそれに応じてビューポートを切り替えたい:

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

をそして、これは私が私のビューポートに任意のオフセット(x、y)を追加します UNTIL正常に動作します。 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)

どのように私はそれを動作させることができますか?

答えて

0

を見て発見し、gamedevフォーラムにそれを掲載している: https://gamedev.stackexchange.com/questions/122284/glviewport-offset-and-ortho-projection/122289#122289

短く: 私はシーン全体をフレームバッファーに描画していました。そして、生成されたテクスチャをスクリーンにレンダリングしました。この操作により、不要なglViewport()変換の蓄積が発生しました。

これに対処するには、glViewport()をフレームバッファに元々描画してから、スクリーンにテクスチャを描画するときにオフセットを設定することです。

0

まず、縦横比は常に幅/高さです。

それから私は、あなたが探しているものだと思う:

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

+0

これはうまくいきません。投稿を編集して、このソリューションをどうやって思いついたでしょうか?そしてマバイはそれに同意しますか?オルトの投影についてのwikiページにはそれに関する情報がないので。 – Amadeusz

関連する問題