Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates xcode 4.2中的OpenGL游戏模板(这段代码是怎么回事?!!)_Templates_Opengl Es 2.0 - Fatal编程技术网

Templates xcode 4.2中的OpenGL游戏模板(这段代码是怎么回事?!!)

Templates xcode 4.2中的OpenGL游戏模板(这段代码是怎么回事?!!),templates,opengl-es-2.0,Templates,Opengl Es 2.0,您好,我已经尽可能多地理解代码这一部分中发生了什么,但我没有任何运气 glGenVertexArraysOES(1, &_vertexArray); glBindVertexArrayOES(_vertexArray); glGenBuffers(1, &_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexDat

您好,我已经尽可能多地理解代码这一部分中发生了什么,但我没有任何运气

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0));
glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

glBindVertexArrayOES(0);
这属于在xcode 4.2上创建OpenGL游戏的模板。然而,我完全困惑了,如果有人能给我解释一下,我会很高兴的

首先,如何生成和绑定_vertexArray而不向其添加任何内容

其次,如果gCubeVertexData是一个216的数组,具有以下内容:

GLfloat gCubeVertexData[216] = 
{
    // Data layout for each line below is:
    // positionX, positionY, positionZ,     normalX, normalY, normalZ,
    0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,
    0.5f, 0.5f, -0.5f,         1.0f, 0.0f, 0.0f,
我假设我为下面的命令处理这个数组,在这里我启用了GLK属性,这就是我使用指针的目的(仍然使用prev-bound指针)。但是如果我没有弄错的话,语法是,(属性设置,顶点的大小,类型,false,结构的大小(我认为不是24),和数据的偏移量(12从哪里来?!))

最后一个问题,为什么我现在要将0绑定到顶点数组

EDIT:老实说,我确实尝试过在不同的网站上研究opengl,但我只能找到理论而不是实践。这就是我问这个问题的原因。

好的,一步一步:

glGenVertexArraysOES(1, &_vertexArray);
glBindVertexArrayOES(_vertexArray);
这将绑定并生成顶点数组对象(VAO)。现在,VAO不包含任何数据。它只包含与顶点数组/属性相关的所有状态,如启用的属性或使用
glvertexattributepointer
进行的设置

glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(gCubeVertexData), gCubeVertexData, GL_STATIC_DRAW);
现在,这将创建并绑定一个顶点缓冲区对象(VBO),它本质上是一个由OpenGL管理的普通数据缓冲区,并将顶点数据复制到其中

让我们看看这些数据:

GLfloat gCubeVertexData[216] = 
{
    // Data layout for each line below is:
    // positionX, positionY, positionZ,     normalX, normalY, normalZ,
    0.5f, -0.5f, -0.5f,        1.0f, 0.0f, 0.0f,
数据以一组浮点数(每个浮点数为32位/4字节)的形式排列,每六个值表示一个顶点,该顶点又由一个位置(3个浮点数)和一个法线(3个浮点数)组成

这将指定每个顶点包含3个浮点值的第一个属性(位置),每个顶点之间的跨距为24字节。这意味着从一个顶点的属性值(本例中的位置)的开始到下一个顶点的属性数据的开始有24个字节。实际上,24字节是6个浮点数的大小,因此是顶点数据中单个顶点的数据,所以这正好适合。最后一个参数表示位置数据从当前绑定的VBO(包含顶点数据)的开始处开始,因为它是顶点数据中的第一个属性

glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));
这将指定第二个属性(normal)为每个顶点包含3个浮点值,步幅为24字节,就像从相同的数据中获取它一样。所以从一个正常值到下一个正常值也是24字节(6个浮点)。现在,最后一个参数表示,正常数据在当前绑定的VBO(包含顶点数据)开始后12个字节(3个浮点)开始。这是必要的,因为法线是顶点数据中的第二个属性,所以我们需要“跳过”前三个值(即位置)以获得法线数据。如果我们再次使用0,我们将采用与位置相同的数据

glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribNormal);
这些最终启用了用于渲染的属性

glBindVertexArrayOES(0);
现在,这将绑定默认(no)VAO,因为我们已经完成了对它的指定。我想这整个代码片段是一些初始化例程的一部分。所以现在,无论何时我们以后想要渲染顶点数据,可能都要使用
glDrawArrays
,在调用draw方法之前,我们只需要使用
glBindVertexArray
绑定VAO,并且由
GlenableVertexAttributeArray
glvertexAttributePointer
创建的每个顶点数组状态都可以获取VAO上次绑定时设置的值,就像在初始化例程中一样。如果不使用VAO,则每次要绘制此顶点数据时,必须调用
glBindBuffer
和两个
glEnableVetrexAttribArray
glVertexAttribPointer
调用

glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12));

但所有这些解释都假设你或多或少熟悉这些概念。如果所有这些话都不能告诉你什么,那么你应该先从一些真正的学习资源开始学习,然后再尝试破译其他人的代码。

非常感谢,这些代码来自直接来自xcode的模板。我曾经用在线教程做过一次,但它没有管理好步幅,所以直到现在我才真正知道它意味着什么。事实证明,在ios 5上使用新的glkit学习opengl es 2非常困难。@LuisOscar如果答案是您的问题的解决方案,请选择。如果你对你的问题还有一些不明确的地方,尽管问吧。嘿,只是想知道你是否能帮我解决这个问题:()我想不出来。我发誓我已经试过在它上面找东西了,我甚至买了《iOS5教程》这本书,但它没有涵盖这一点,还有Iphone 3d编程(但我放弃了,因为我买的是日文的,它没有编译,因为版本与iOS4和5不同)。谢谢