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