OpenGL ES 2.0(iOS)中的二维图形

OpenGL ES 2.0(iOS)中的二维图形,ios,opengl-es,drawing,2d,opengl-es-2.0,Ios,Opengl Es,Drawing,2d,Opengl Es 2.0,我正在学习如何在iOS上使用OpenGL ES 2.0。现在我只想做一些基本的2D动画(例如,在屏幕周围移动一个矩形并改变其大小)。我从苹果在Xcode中提供的OpenGL ES项目模板开始。我的绘图代码如下所示: static GLfloat squareVertices[] = { -0.5f, -0.33f, 0.5f, -0.33f, -0.5f, 0.33f, 0.5f, 0.33f }; // Update attribute values.

我正在学习如何在iOS上使用OpenGL ES 2.0。现在我只想做一些基本的2D动画(例如,在屏幕周围移动一个矩形并改变其大小)。我从苹果在Xcode中提供的OpenGL ES项目模板开始。我的绘图代码如下所示:

static GLfloat squareVertices[] = {
    -0.5f, -0.33f,
    0.5f, -0.33f,
    -0.5f,  0.33f,
    0.5f,  0.33f
 };

// Update attribute values.
glVertexAttribPointer(VERTEX_ATTR, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(VERTEX_ATTR);

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors);
glEnableVertexAttribArray(COLOR_ATTR);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
现在这将在屏幕中间画一个。但如果我开始通过添加以下代码来更改矩形,它将开始:

这就好像矩形的一部分附着在屏幕的中心。我是OpenGL ES的新手,所以我确信我的问题是显而易见的。我还假设这与OpenGL ES是一个3D图形库有关,我试图将其视为一个2D空间。所以我的问题是:在OpenGL ES 2.0中绘制2D对象并设置其动画的最佳方法是什么?我在网上看到了一些OpenGLES1.1的东西,但这对我帮助不大。他们是在OpenGLES2.0中使用2D绘图的特殊技术,还是有某种2D绘图模式


任何指导都将不胜感激。

经过一番尝试后,我将绘图代码更改为:

static GLfloat squareVertices[12] = {
    -0.5f, -0.33f, 0.0,
    0.5f, -0.33f, 0.0,
    -0.5f, 0.33f, 0.0,
    0.5f, 0.33f, 0.0
};

// Update attribute values.
glVertexAttribPointer(VERTEX_ATTR, 3, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(VERTEX_ATTR);

glVertexAttribPointer(COLOR_ATTR, 4, GL_UNSIGNED_BYTE, 1, 0, squareColors);
glEnableVertexAttribArray(COLOR_ATTR);

squareVertices[7] -= .001;
squareVertices[10] -= .001;

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

将第三个0.0浮点值添加到每个顶点似乎可以达到目的。我不清楚为什么会这样,如果有人能透露一些信息,我会很感激的。

我是OpenGL新手,但vertex不需要3个浮点,每个轴一个:X,Y,Z

因此,第一个顶点数组将是:

( -0.50f, -0.33f, 0.50f) 
( -0.33f, -0.50f, 0.33f)
(  0.50f,  0.33f, ?????)
第二项是:

( -0.50f, -0.33f, 0.00f )
(  0.50f, -0.33f, 0.00f )
( -0.50f,  0.33f, 0.00f )
(  0.50f,  0.33f, 0.00f )
我真的是一个新手,所以不要把我看得太认真…:)

顺便说一句,这是我找到的关于OpenGL的最好的知识来源:


希望这个答案有意义…

因为glvertexattributepointer的第三个参数是'3'。我相信您可以将其设置为2,但我还没有在GL中尝试过。我猜丢失的z轴将在内部填充为“0”(但请再次尝试并查看!)。在内部,它可能都是4个浮点向量,第4个('w')参数用于齐次矩阵乘法gubbins

如果您在移动设备上执行此操作,您可能还希望研究定点数学(在某些没有浮点co-pro的设备上速度更快)以及顶点缓冲区对象,这在许多机器上更有效。此外,还可以使用固定顶点格式,例如

glInterleavedArrays(format_code, stride, data)

对于您决定使用的任何“格式\代码”,该设备可能具有优化的代码路径,因此可能会更有效。

@macinjosh:这是对您更新的问题的回答,供对答案感兴趣的人参考。我猜你从12月10日发帖以来获得了更多的知识

OpenGL顶点是三维的,而不是二维的。为了完全真实,它们实际上是在4D中,因为它们也包含一个W分量,但是现在只需把值1看成一个同质向量。
由于其3D特性,除非在着色器中添加“z”组件,否则必须指定一个作为顶点属性。

该博客很棒,但该系列文章在第四章之后结束。当我意识到他停下来时,我真的很沮丧:(
glInterleavedArrays(format_code, stride, data)