[英]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.