私はOpenGLでプログラミングを行っており、その中に表示可能領域を設定する方法を知っていますgluOrtho()
が、このような機能はOpenGL ES 2.0には存在しません。
OpenGL ES 2.0 でこれを行うにはどうすればよいですか?
PS : PowerVR SDK エミュレーターを使用して、Ubuntu 10.10 で OpenGL ES 2.0 開発を行っています。
私はOpenGLでプログラミングを行っており、その中に表示可能領域を設定する方法を知っていますgluOrtho()
が、このような機能はOpenGL ES 2.0には存在しません。
OpenGL ES 2.0 でこれを行うにはどうすればよいですか?
PS : PowerVR SDK エミュレーターを使用して、Ubuntu 10.10 で OpenGL ES 2.0 開発を行っています。
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;
これに基づいて、表示スペースのさまざまな制限を設定して、ジオメトリに対応できるようにする必要があります。
と呼ばれる関数はありませんgluOrtho
。ありgluOrtho2D
、ありglOrtho
、どちらも非常に似たようなことをします。しかし、それらのどれもビューポートを設定しませんでした。
OpenGLパイプラインのビューポート変換はとによって制御されglViewport
ますglDepthRange
。あなたが話しているのは正射影行列であり、これは両方が計算するものglOrtho
ですgluOrtho2D
。
OpenGL ES 2.0には、デスクトップOpenGLpre-3.1のような固定機能の便利さの多くはありません。したがって、自分で作成する必要があります。正投影マトリックスの作成は非常に簡単です。glOrthoとgluOrtho2Dのドキュメントには、どちらも行列の作成方法が記載されています。
このマトリックスをシェーダーユニフォームを介してシェーダーに渡す必要があります。次に、この行列を使用して、目の空間から頂点の位置を変換する必要があります(目の位置を原点として定義し、+ Xを右に、+ Yを上に、+ Zを目に向けます)。
GLkit で定義されている次の便利なメソッドを使用することもできます。
GLKMatrix4 GLKMatrix4MakeOrtho (
float left,
float right,
float bottom,
float top,
float nearZ,
float farZ
);
Z 値に (-1, 1) を渡すだけです。