Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
Iphone 如何向着色器说明顶点属性?_Iphone_Opengl Es_Shader_Vertex - Fatal编程技术网

Iphone 如何向着色器说明顶点属性?

Iphone 如何向着色器说明顶点属性?,iphone,opengl-es,shader,vertex,Iphone,Opengl Es,Shader,Vertex,我想在着色器程序运行时和固定VBO数组之间切换 我认为我只需要以下具有固定顶点属性索引的函数(我希望0表示位置,1表示纹理坐标) 我已经把一切都联系上了,但没有任何东西吸引到FBO。 如果我使用从程序中找到的顶点属性索引(在glVertexAttribPointer中),那么它可以正常工作,但我不能将其与固定属性索引一起使用 有人能给我一个简单的示例代码,告诉我上述函数的正确用法/执行顺序吗? 是否缺少任何步骤?关键是:必须在链接程序之前调用GLBindAttriblLocation glBin

我想在着色器程序运行时和固定VBO数组之间切换

我认为我只需要以下具有固定顶点属性索引的函数(我希望0表示位置,1表示纹理坐标)

我已经把一切都联系上了,但没有任何东西吸引到FBO。 如果我使用从程序中找到的顶点属性索引(在glVertexAttribPointer中),那么它可以正常工作,但我不能将其与固定属性索引一起使用

有人能给我一个简单的示例代码,告诉我上述函数的正确用法/执行顺序吗?


是否缺少任何步骤?

关键是:必须在链接程序之前调用GLBindAttriblLocation

glBindAttribLocation(program, ATTRIBUTE_POSITION, "position");
glBindAttribLocation(program, ATTRIBUTE_TEXTURE_COORDINATES, "textureCoordinates");      
glLinkProgram(program);
然后可以使用具有固定索引的属性数组函数,如:

glEnableVertexAttribArray(ATTRIBUTE_POSITION);
glEnableVertexAttribArray(ATTRIBUTE_TEXTURE_COORDINATES);    
glVertexAttribPointer(ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)0);    
glVertexAttribPointer(ATTRIBUTE_TEXTURE_COORDINATES, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)_textureCoordinatesOffset);  
其中索引仅为简单整数,如下所示:

//Vertex attributes.
enum 
{
    ATTRIBUTE_POSITION,            //0
    ATTRIBUTE_TEXTURE_COORDINATES  //1
};

现在可以了。因此,我不必在每次绘图调用之前调用glvertexattributepointer。

关键是:必须在链接程序之前调用glbindAttributeLocation

glBindAttribLocation(program, ATTRIBUTE_POSITION, "position");
glBindAttribLocation(program, ATTRIBUTE_TEXTURE_COORDINATES, "textureCoordinates");      
glLinkProgram(program);
然后可以使用具有固定索引的属性数组函数,如:

glEnableVertexAttribArray(ATTRIBUTE_POSITION);
glEnableVertexAttribArray(ATTRIBUTE_TEXTURE_COORDINATES);    
glVertexAttribPointer(ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)0);    
glVertexAttribPointer(ATTRIBUTE_TEXTURE_COORDINATES, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)_textureCoordinatesOffset);  
其中索引仅为简单整数,如下所示:

//Vertex attributes.
enum 
{
    ATTRIBUTE_POSITION,            //0
    ATTRIBUTE_TEXTURE_COORDINATES  //1
};
现在可以了。因此,我不必在每次draw调用之前调用GlvertexAttribute指针。

正如医生所说(http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml):

属性变量名到的通用属性索引绑定 程序对象可以在任何时候通过调用 glBindAttribLocation。属性绑定直到 glLinkProgram被称为。链接程序对象之后 成功地,通用属性的索引值保持不变 (并且可以查询它们的值),直到下一个链接命令出现

不允许应用程序绑定任何标准OpenGL顶点 属性,因为当 需要程序对象创建后发生的任何属性绑定 链接将在下次程序启动之前生效 对象已链接

正如医生所说(http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml):

属性变量名到的通用属性索引绑定 程序对象可以在任何时候通过调用 glBindAttribLocation。属性绑定直到 glLinkProgram被称为。链接程序对象之后 成功地,通用属性的索引值保持不变 (并且可以查询它们的值),直到下一个链接命令出现

不允许应用程序绑定任何标准OpenGL顶点 属性,因为当 需要程序对象创建后发生的任何属性绑定 链接将在下次程序启动之前生效 对象已链接


这有帮助:这有帮助:-1:“有人能给我一个简单的示例代码,向我展示上面函数的正确用法/执行顺序吗?”这是一个很糟糕的问题。你不知道这些函数的顺序的唯一方法是如果你不知道它们做什么。所以你需要问这些函数是如何工作的;否则,你只是复制和粘贴编码。@Nicol:这样的事情很好,但没有告诉我关于执行顺序的任何信息。我真的知道glBindAttribLocation是做什么的,但当它不起作用时,仅仅因为我在链接程序后使用了它,那么我就不知道去哪里。好吧,对你来说+1,我在文档中找到了它。:)发布了另一个答案。-1:“有人能给我一个简单的示例代码,告诉我上面函数的正确用法/执行顺序吗?”这是一个很糟糕的问题。你不知道这些函数的顺序的唯一方法是如果你不知道它们做什么。所以你需要问这些函数是如何工作的;否则,你只是复制和粘贴编码。@Nicol:这样的事情很好,但没有告诉我关于执行顺序的任何信息。我真的知道glBindAttribLocation是做什么的,但当它不起作用时,仅仅因为我在链接程序后使用了它,那么我就不知道去哪里。好吧,对你来说+1,我在文档中找到了它。:)发布了另一个答案。