【问题标题】:How to divide an OpenGL window into multiple windows on the same screen?如何在同一个屏幕上将一个OpenGL窗口划分为多个窗口?
【发布时间】:2014-04-13 04:32:56
【问题描述】:

我有一个cube.c 程序,它显示一个可以使用箭头键旋转的立方体。我想将包含多维数据集的结果窗口划分为多个(比如 4 个)窗口,以便每个窗口包含该多维数据集的一部分(右上角、左上角、右下角、左下角)和每个部分使用箭头键以当它是单个窗口时的方式响应旋转。所以,如果我按右箭头键,立方体应该向右旋转,每个窗口上都可以看到相应的变化。能做到吗? 这是我的cube.c

#include <stdio.h>
#include <stdarg.h>
#include <math.h>
#define GL_GLEXT_PROTOTYPES
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

// ----------------------------------------------------------
// Function Prototypes
// ----------------------------------------------------------
void display();
void specialKeys();

// ----------------------------------------------------------
// Global Variables
// ----------------------------------------------------------
double rotate_y=0; 
double rotate_x=0;

// ----------------------------------------------------------
// display() Callback function
// ----------------------------------------------------------
void display(){

  //  Clear screen and Z-buffer
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

  // Reset transformations
  glLoadIdentity();


  // Rotate when user changes rotate_x and rotate_y
  glRotatef( rotate_x, 1.0, 0.0, 0.0 );
  glRotatef( rotate_y, 0.0, 1.0, 0.0 );


  //Multi-colored side - FRONT
  glBegin(GL_POLYGON);

  glColor3f( 1.0, 0.0, 0.0 );     glVertex3f(  0.5, -0.5, -0.5 );      // P1 is red
  glColor3f( 0.0, 1.0, 0.0 );     glVertex3f(  0.5,  0.5, -0.5 );      // P2 is green
  glColor3f( 0.0, 0.0, 1.0 );     glVertex3f( -0.5,  0.5, -0.5 );      // P3 is blue
  glColor3f( 1.0, 0.0, 1.0 );     glVertex3f( -0.5, -0.5, -0.5 );      // P4 is purple

  glEnd();

  // White side - BACK
  glBegin(GL_POLYGON);
  glColor3f(   1.0,  1.0, 1.0 );
  glVertex3f(  0.5, -0.5, 0.5 );
  glVertex3f(  0.5,  0.5, 0.5 );
  glVertex3f( -0.5,  0.5, 0.5 );
  glVertex3f( -0.5, -0.5, 0.5 );
  glEnd();

  // Purple side - RIGHT
  glBegin(GL_POLYGON);
  glColor3f(  1.0,  0.0,  1.0 );
  glVertex3f( 0.5, -0.5, -0.5 );
  glVertex3f( 0.5,  0.5, -0.5 );
  glVertex3f( 0.5,  0.5,  0.5 );
  glVertex3f( 0.5, -0.5,  0.5 );
  glEnd();

  // Green side - LEFT
  glBegin(GL_POLYGON);
  glColor3f(   0.0,  1.0,  0.0 );
  glVertex3f( -0.5, -0.5,  0.5 );
  glVertex3f( -0.5,  0.5,  0.5 );
  glVertex3f( -0.5,  0.5, -0.5 );
  glVertex3f( -0.5, -0.5, -0.5 );
  glEnd();

  // Blue side - TOP
  glBegin(GL_POLYGON);
  glColor3f(   0.0,  0.0,  1.0 );
  glVertex3f(  0.5,  0.5,  0.5 );
  glVertex3f(  0.5,  0.5, -0.5 );
  glVertex3f( -0.5,  0.5, -0.5 );
  glVertex3f( -0.5,  0.5,  0.5 );
  glEnd();

  // Red side - BOTTOM
  glBegin(GL_POLYGON);
  glColor3f(   1.0,  0.0,  0.0 );
  glVertex3f(  0.5, -0.5, -0.5 );
  glVertex3f(  0.5, -0.5,  0.5 );
  glVertex3f( -0.5, -0.5,  0.5 );
  glVertex3f( -0.5, -0.5, -0.5 );
  glEnd();

  glFlush();
  glutSwapBuffers();

}

// ----------------------------------------------------------
// specialKeys() Callback Function
// ----------------------------------------------------------
void specialKeys( int key, int x, int y ) {

  //  Right arrow - increase rotation by 5 degree
  if (key == GLUT_KEY_RIGHT)
    rotate_y += 5;

  //  Left arrow - decrease rotation by 5 degree
  else if (key == GLUT_KEY_LEFT)
    rotate_y -= 5;

  else if (key == GLUT_KEY_UP)
    rotate_x += 5;

  else if (key == GLUT_KEY_DOWN)
    rotate_x -= 5;

  //  Request display update
  glutPostRedisplay();

}

// ----------------------------------------------------------
// main() function
// ----------------------------------------------------------
int main(int argc, char* argv[]){

  //  Initialize GLUT and process user parameters
  glutInit(&argc,argv);

   //  Request double buffered true color window with Z-buffer
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

  // Create window
  glutCreateWindow("Rotating Cube");

  //  Enable Z-buffer depth test
  glEnable(GL_DEPTH_TEST);

  // Callback functions
  glutDisplayFunc(display);
  glutSpecialFunc(specialKeys);

  //  Pass control to GLUT for events
  glutMainLoop();

  return 0;
}

【问题讨论】:

    标签: c++ opengl glut


    【解决方案1】:

    你可以使用libtr:

    TR(平铺渲染)库是一个用于平铺渲染的 OpenGL 实用程序库。平铺渲染是一种以块(平铺)的形式生成大图像的技术。

    TR 是内存高效的;无需在主内存中分配完整大小的图像缓冲区即可生成任意大的图像文件。

    【讨论】:

    • 你能告诉我如何在这个程序中同时使用glScissor()glViewport()吗?
    • 感谢您的编辑。但我认为你误解了这个问题。我不希望立方体在不同的窗口上有不同的面。我只想将显示多维数据集的主窗口拆分为不同的部分。像这样,但在同一屏幕上:geeks3d.com/public/jegx/200810/equalizer-0.5.5.jpg
    • 我经常发现做一些基本的线性代数比glViewportglScrissors 要好,毕竟OpenGL 是关于转换的。
    【解决方案2】:

    感谢您的编辑。但我认为你误解了这个问题。我不希望立方体在不同的窗口上有不同的面。我只想将显示多维数据集的主窗口拆分为不同的部分。像这样,但在同一屏幕上:geeks3d.com/public/jegx/200810/equalizer-0.5.5.jpg

    在那里看到的效果可以通过使用由比例和平移组成的附加投影后变换来实现。在经典的固定函数 GL 中,可以简单地将这样的矩阵预乘到投影矩阵。因此,您必须确保每个窗口同时使用所有相同的参数渲染相同的场景,每个窗口只有这个单一的转换不同。

    您必须设置某种“总视口”来描述应用程序视图要扩展的轴对齐矩形。然后,您可以将每个窗口描述为相对于“总视口”的总和轴对齐矩形。您所要做的就是获得 x 和 y 的比例因子以及平移部分。两者都很容易找到。

    您应该知道的是,您的屏幕截图所在的equalizer 是一个分布式渲染系统,这意味着单独的显示器(通常)由通过网络连接的单独机器驱动。在此设置中,一般原则保持不变,但“同时渲染相同的东西”部分将变得更加困难。但是这些东西超出了 OpenGL 本身的范围。像前面提到的均衡器这样的软件实际上可以帮助你编写这样的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2020-11-11
      • 1970-01-01
      • 2019-09-06
      相关资源
      最近更新 更多