1

私はOpenGLでプログラミングを行っており、その中に表示可能領域を設定する方法を知っていますgluOrtho()が、このような機能はOpenGL ES 2.0には存在しません。

OpenGL ES 2.0 でこれを行うにはどうすればよいですか?

PS : PowerVR SDK エミュレーターを使用して、Ubuntu 10.10 で OpenGL ES 2.0 開発を行っています。

4

3 に答える 3

4

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;

これに基づいて、表示スペースのさまざまな制限を設定して、ジオメトリに対応できるようにする必要があります。

于 2011-06-24T22:51:46.817 に答える
2

と呼ばれる関数はありませんgluOrtho。ありgluOrtho2D、ありglOrtho、どちらも非常に似たようなことをします。しかし、それらのどれもビューポートを設定しませんでした。

OpenGLパイプラインのビューポート変換はとによって制御されglViewportますglDepthRange。あなたが話しているのは正射影行列であり、これは両方が計算するものglOrthoですgluOrtho2D

OpenGL ES 2.0には、デスクトップOpenGLpre-3.1のような固定機能の便利さの多くはありません。したがって、自分で作成する必要があります。正投影マトリックスの作成は非常に簡単です。glOrthogluOrtho2Dのドキュメントには、どちらも行列の作成方法が記載されています。

このマトリックスをシェーダーユニフォームを介してシェーダーに渡す必要があります。次に、この行列を使用して、目の空間から頂点の位置を変換する必要があります(目の位置を原点として定義し、+ Xを右に、+ Yを上に、+ Zを目に向けます)。

于 2011-06-23T04:05:42.587 に答える
0

GLkit で定義されている次の便利なメソッドを使用することもできます。

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

Z 値に (-1, 1) を渡すだけです。

于 2012-07-01T02:01:58.103 に答える