2

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

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

我班级中的beginandend方法现在是简单的方法,如下所示:

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,然后在屏幕上绘制所有三个。本质上,这就像三个不同的摄像机用于场景,它们是两个被绘制在屏幕上。(例如,考虑在屏幕上绘制的顶部、右侧、底部视图,屏幕分为三列)。

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

4

1 回答 1

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 扩展(自 4.1 以来的核心)一次通过。在这种情况下,顶点着色器将只进行模型视图转换,并且您将所有三个投影矩阵作为制服,并且在几何着色器中为每个输入三角形生成三个不同的三角形(由各自的矩阵投影),每个三角形都有不同的gl_ViewportIndex

layout(triangles) in;
layout(triangle_strip, max_vertices=9) out;

uniform mat4 projection[3];

void main()
{
    for(int i=0; i<projection.length(); ++i)
    {
        gl_ViewportIndex = i;
        for(int j=0; j<gl_in.length(); ++j)
        {
            gl_Position = projection[i] * gl_in[j].gl_Position;
            EmitVertex();
        }
        EndPrimitive();
    }
}

但是考虑到您使用过时的旧功能,我想说几何着色器和 OpenGL 4.1 功能还不是您的选择(或者至少不是您当前框架中要更改的第一件事)。

于 2013-06-14T11:47:54.557 回答