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

Opengl es 如何在OpenGL ES 2.0中设置场景中的可视区域?,opengl-es,opengl-es-2.0,orthographic,Opengl Es,Opengl Es 2.0,Orthographic,我已经在OpenGL中完成了编程,我知道如何使用gluOrtho()设置其中的可视区域,但是OpenGL ES 2.0中不存在这样的函数 在OpenGL ES 2.0中,我将如何做到这一点 附言:我正在用PowerVR SDK模拟器在Ubuntu10.10中开发OpenGL ES 2.0。没有名为gluOrtho的函数。有gluOrtho2D,也有glOrtho,两者的作用非常相似。但它们都没有设置视口 OpenGL管道的视口变换由glViewport和gldeptrange控制。你所说的是一个

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

在OpenGL ES 2.0中,我将如何做到这一点


附言:我正在用PowerVR SDK模拟器在Ubuntu10.10中开发OpenGL ES 2.0。

没有名为
gluOrtho
的函数。有
gluOrtho2D
,也有
glOrtho
,两者的作用非常相似。但它们都没有设置视口

OpenGL管道的视口变换由
glViewport
gldeptrange
控制。你所说的是一个正交投影矩阵,这是
glOrtho
glortho2d
都要计算的

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


您需要通过着色器统一将此矩阵传递给着色器。然后,您需要使用此矩阵从眼睛空间变换顶点位置(定义为以眼睛位置为原点,+X向右,+Y向上,+Z朝向眼睛)。

没有称为
gluOrtho
的函数。有
gluOrtho2D
,也有
glOrtho
,两者的作用非常相似。但它们都没有设置视口

OpenGL管道的视口变换由
glViewport
gldeptrange
控制。你所说的是一个正交投影矩阵,这是
glOrtho
glortho2d
都要计算的

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


您需要通过着色器统一将此矩阵传递给着色器。然后,您需要使用此矩阵从眼睛空间变换顶点位置(定义为以眼睛位置为原点,+X向右,+Y向上,+Z朝向眼睛)。

正如Nicol所建议的,您需要设置正交投影矩阵。例如,我使用的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;

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

正如Nicol所建议的,您需要设置正交投影矩阵。例如,我使用的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;

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

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

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

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

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

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

只需通过(-1,1)获得Z值。

你能给我一个例子吗?假设我必须显示一个10条边不小于此边的三角形。你能给我一个例子吗?假设我必须显示一个10条边不小于此边的三角形。这对我很有帮助,我唯一被卡住的部分是不知道这些计算的起源。我认为这是很好的背景材料:。还应该注意的是,上面显示的矩阵是在假设它是row MARGY的情况下组成的。这里的链接帮助我认识到这一点,并相应地为OpenGL转置:)这帮了我很大的忙,我唯一被卡住的部分是不知道这些计算的起源。我认为这是很好的背景材料:。还应该注意的是,上面显示的矩阵是在假设它是row MARGY的情况下组成的。这里的链接帮助我实现了这一点,并相应地为OpenGL转置:)