在单个屏幕上绘制多个场景视图

时间:2013-06-14 11:31:19

标签: c++ algorithm opengl 3d

我在OpenGL中有一个投影类,用户可以按如下方式使用:

//inside the draw method
customCam1.begin();
    //draw various things here
customCam1.end();

我班上的beginend方法现在是简单方法,如下所示:

void CustomCam::begin(){
    saveGlobalMatrices();
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-hParam,hParam,-tParam,tParam,near,far);//hParam and tParam are supplied by the user of the class
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void CustomCam::end(){
    loadGlobalMatrices();
};

我希望用户能够创建上述类的多个实例(为每个类提供lParamtParam的不同参数),然后在屏幕上绘制所有这三个。从本质上讲,这就像三个不同的场景摄像机,两个在屏幕上绘制。 (例如,考虑在屏幕上绘制的顶部,右侧,底部视图,屏幕分为三列)。

既然只有一个投影矩阵,我如何同时实现三种不同的自定义凸轮视图?

1 个答案:

答案 0 :(得分:2)

您每次必须使用不同的投影矩阵(在您的情况下为相机对象)三次绘制场景。在这三个过程中的每个过程中,您为渲染设置了一个不同的视口,以显示在整个帧缓冲区的不同部分中:

glViewport(0, 0, width/3, height);   //first column
customCam1.begin();
//draw scene
customCam1.end();

glViewport(width/3, 0, width/3, height);   //second column
customCam2.begin();
//draw scene
customCam2.end();

glViewport(2*width/3, 0, width/3, height);   //third column
customCam3.begin();
//draw scene
customCam3.end();

但你无法一次性使用三个不同的投影矩阵和三个不同的视口来绘制整个场景。


编辑:为了完整起见,您确实可以使用几何着色器和GL_ARB_viewport_array extension(自4.1以来的核心)一次通过。在这种情况下,顶点着色器只会进行模型视图转换,您可以将所有三个投影矩阵作为制服,并在几何着色器中为每个输入三角形生成三个不同的三角形(由各个矩阵投影),每个三角形具有不同的{{ 1}}:

gl_ViewportIndex

但是考虑到你使用了缩减的旧功能,我说几何着色器和OpenGL 4.1功能对你来说还不是一个选项(或者至少不是你当前框架中要改变的第一件事)。