我正在尝试将OpenGL ES 1
应用程序转换为OpenGL ES 2
应用程序,以便能够使用着色器。现在我使用glOrthof函数来创建一个“真实大小的视口”,这样我就可以将顶点放在OpenGL视图中的“实际”像素上。
glOrthof(0, _frame.size.width, _frame.size.height, 0, -1, 1);
我无法在OpenGL ES 2
中找到如何实现这一目标,是否有人可以告诉我该怎么做?
如果没有,是否有人链接到良好的OpenGL ES 1 to OpenGL ES 2
教程/解释?
答案 0 :(得分:12)
glOrtho
方法除了创建新矩阵并将当前投影矩阵乘以此矩阵之外别无其他。使用OpenGL ES 2.0,您必须自己管理矩阵。为了复制glOrtho
行为,您需要在顶点着色器中为投影矩阵提供一个统一,然后将顶点乘以。通常你也有一个模型和一个视图矩阵(或一个组合的模型视图矩阵,就像在OpenGL ES 1中一样),你可以在投影变换之前转换你的顶点:
uniform mat4 projection;
uniform mat4 modelview;
attribute vec4 vertex;
void main()
{
gl_Position = projection * (modelview * vertex);
}
可以找到glOrtho
构建的特定投影矩阵here。
答案 1 :(得分:10)
正如Christian所描述的那样,处理顶点的所有矩阵数学都取决于你,所以你必须复制glOrthof()
创建的矩阵。在我的回答here中,我提供了以下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;
}
此处使用的矩阵定义为
GLfloat orthographicMatrix[16];
然后我使用以下内容在顶点着色器中应用矩阵:
gl_Position = modelViewProjMatrix * position * orthographicMatrix;
我的乘法顺序与Christian的不同,所以我可能会在这里做一些落后的事情,但这是我在我的OpenGL ES 2.0应用程序中处理这个问题(可以找到它的源代码{ {3}})。