2016-06-01 19 views
0

In allen Tutorials fand ich über die Erstellung Projektionsmatrix basierend auf Ansichtsfenstergröße alle von ihnen angenommen, dass links unten Koordinaten des Ansichtsfensters (0,0) sein wird.glViewport Offset und Orthoprojektion

Jetzt möchte ich auf die verschiedenen Teile des Bildschirms zu ziehen und zu diesem Zweck möchte ich Ansichtsfenster entsprechend wechseln:

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 

Jetzt habe ich ein Problem mit meiner Projektionsmatrix definieren. Ohne jede (x, y) offest ich diesen Code wurde mit für meine ortho Projektionsmatrix Berechnung:

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

Und das funktioniert gut BIS Ich werde jede (x, y) zu meinem Ansichtsfenster-Offset hinzuzufügen. Die Wirkung folgt, wenn glViewport(0, m_WindowHeight/2, m_WindowWidth/2, m_WindowHeight/2 verwenden):

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

Und mit glViewport(0, 0, m_WindowWidth/2, m_WindowHeight/2): glViewport(0, 0, m_WindowWidth/2, m_WindowHeight/2)

Wie kann ich es funktioniert?

Antwort

0

ich Lösung für dieses Problem gefunden und veröffentlicht es auf dem gamedev Forum: https://gamedev.stackexchange.com/questions/122284/glviewport-offset-and-ortho-projection/122289#122289

Kurz gesagt: Ich zeichnete meine gesamte Szene zum Framebuffer und dann generierte ich generierte Textur auf den Bildschirm. Diese Operation verursachte eine unerwünschte Ansammlung von glViewport() - Transformationen.

Lösung zu diesem setzt die glViewport() zu ursprünglichen frore Rendering auf den Framebuffer und dann Offset setzen beim Rendern Textur auf dem Bildschirm.

0

Zunächst ist das Seitenverhältnis immer Breite/Höhe.

Dann denke ich, was Sie suchen ist:

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; 

Haben Sie einen Blick auf diese wiki page

+0

Nun, das funktioniert nicht. Können Sie Ihren Beitrag bearbeiten und beschreiben, wie Sie diese Lösung entwickelt haben? Und maby Teilen refference zu ihm? Weil Wiki-Seite über Orthoprojektion keine Informationen darüber haben. – Amadeusz