繁体   English   中英

OpenGL ES 2.0(iOS)中的2D绘图

[英]2D Drawing In OpenGL ES 2.0 (iOS)

我正在学习如何在iOS上使用OpenGL ES 2.0。 现在我想做一些基本的2D动画(例如在屏幕周围移动一个矩形并改变它的大小)。 我已经开始使用Apple在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);

现在,这将在屏幕中间绘制一个漂亮的矩形 但是,如果我通过添加以下代码开始更改矩形,它开始看起来很时髦

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

就好像矩形的一部分连接到屏幕的中心。 我是OpenGL ES的新手,所以我确信我的问题很明显。 我还假设这与OpenGL ES是3D图形库有关,我试图把它当作2D空间。 所以我的问题是:在OpenGL ES 2.0中绘制和动画2D对象的最佳方法是什么? 我在网上看过OpenGL ES 1.1的一些东西,但这对我没什么帮助。 他们是在OpenGL ES 2.0中进行2D绘图的特殊技术,还是有某种2D绘图模式?

任何指导将不胜感激。

@macinjosh:这是对您对答案感兴趣的人的更新问题的回复。 我猜你自从2010年12月发布以来已经获得了进一步的知识!

OpenGL顶点是3D,而不是2D。 为了完全真实,它们实际上是4D,因为它们也包含'w'组件,但是现在只需将其视为值1.0,就像同质向量一样。

由于它们的3D-ness,除非在着色器中添加“z”组件,否则必须指定一个作为顶点属性。

我是OpenGL的新手,但顶点不需要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的最佳知识来源:

http://iphonedevelopment.blogspot.com/2010/10/opengl-es-20-for-ios-chapter-3.html

希望这个答案有意义......

因为你有一个'3'作为glVertexAttribPointer的第三个参数。 我相信你可以把它设置为2,但我没有在GL中尝试过这个。 我的猜测是缺少的z轴将在内部填充为“0”(但再次尝试并看到!)。 在内部,它可能都是4个浮点向量,其中第4个('w')参数用于均匀矩阵乘法gubbins。

如果您在移动设备上执行此操作,您可能还希望查看定点数学(在某些没有浮点co-pro的设备上更快)以及Vertex Buffer Objects,它们在许多机器上更有效。 此外,固定的顶点格式,如使用

glInterleavedArrays(format_code, stride, data)

可以证明更高效,因为设备可能已经优化了您决定使用的'format_code'的代码路径。

经过一些游戏后,我将绘图代码更改为:

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浮点数添加到每个顶点似乎可以解决问题。 我不清楚为什么会这样,如果任何人能够阐明一些,我会贬低它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM