如何在OpenGL ES 2.0中的场景中设置可视区域?

时间:2011-06-23 03:46:35

标签: opengl-es opengl-es-2.0 orthographic

我已经在OpenGL中进行了编程,我知道如何使用gluOrtho()在其中设置可视区域,但是在OpenGL ES 2.0中不存在这样的函数。

我如何在OpenGL ES 2.0中执行此操作?

P.S:我正在使用PowerVR SDK模拟器在Ubuntu 10.10中进行OpenGL ES 2.0开发。

3 个答案:

答案 0 :(得分:4)

正如尼科尔建议的那样,你需要设置一个正交投影矩阵。例如,我用来做这个的Objective-C方法如下:

- (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)right bottom:(GLfloat)bottom top:(GLfloat)top near:(GLfloat)near far:(GLfloat)far;
{
    GLfloat r_l = right - left;
    GLfloat t_b = top - bottom;
    GLfloat f_n = far - near;
    GLfloat tx = - (right + left) / (right - left);
    GLfloat ty = - (top + bottom) / (top - bottom);
    GLfloat tz = - (far + near) / (far - near);

    matrix[0] = 2.0f / r_l;
    matrix[1] = 0.0f;
    matrix[2] = 0.0f;
    matrix[3] = tx;

    matrix[4] = 0.0f;
    matrix[5] = 2.0f / t_b;
    matrix[6] = 0.0f;
    matrix[7] = ty;

    matrix[8] = 0.0f;
    matrix[9] = 0.0f;
    matrix[10] = 2.0f / f_n;
    matrix[11] = tz;

    matrix[12] = 0.0f;
    matrix[13] = 0.0f;
    matrix[14] = 0.0f;
    matrix[15] = 1.0f;
}

即使您不熟悉Objective-C方法语法,也应该很容易理解此代码的C主体。矩阵定义为

GLfloat orthographicMatrix[16];

然后,您可以在顶点着色器中应用此选项来调整顶点的位置,使用如下代码:

gl_Position = modelViewProjMatrix * position * orthographicMatrix;

基于此,您应该能够设置显示空间的各种限制以适应几何体。

答案 1 :(得分:2)

没有名为gluOrtho的功能。有gluOrtho2DglOrtho,两者都做非常类似的事情。但是他们都没有设置视口

OpenGL管道的视口转换由glViewportglDepthRange控制。你所说的是一个正交投影矩阵,它是glOrthogluOrtho2D都计算出来的。

OpenGL ES 2.0没有桌面OpenGL 3.1之前的许多固定功能便利。因此,您必须自己创建它们。创建正交矩阵非常容易; glOrthogluOrtho2D的文档都说明了它们如何创建矩阵。

您需要通过着色器制服将此矩阵传递到着色器。然后你需要使用这个矩阵来转换眼睛空间的顶点位置(用眼睛位置定义为原点,+ X定义为右边,+ Y是向上,+ Z是朝向眼睛)。

答案 2 :(得分:0)

您还可以使用GLkit中定义的以下便捷方法。

GLKMatrix4 GLKMatrix4MakeOrtho (
   float left,
   float right,
   float bottom,
   float top,
   float nearZ,
   float farZ
);

只为Z值传递(-1,1)。