我想弄清楚为什么glVertexAttribPointer
中使用的偏移值无法正常工作。
该代码位于http://glbase.codeplex.com/
我的顶点数据是:
glBase::Vector3 data1[]={
glBase::Vector3(-0.4f,0.8f,-0.0f), //Position
glBase::Vector3(1.0f,0.0f,0.0f), //Color
glBase::Vector3(-.8f,-0.8f,-0.0f), //Position etc
glBase::Vector3(0.0f,1.0f,0.0f),
glBase::Vector3(0.0f,-0.8f,-0.0f),
glBase::Vector3(0.0f,0.0f,1.0f)
};
属性绑定就像这样:
program.bindVertexAttribs<float>(vbo1,0, "in_Position", 3, 6, 0);
program.bindVertexAttribs<float>(vbo1,1, "in_Color", 3, 6, 12);
bindVertexAttribs函数定义如下:
template<typename T>
void bindVertexAttribs(const VertexBufferObject& object, GLint location,const std::string& name, unsigned int width, unsigned int stride, unsigned int offset)
{
object.bind();
glBindAttribLocation(m_ID, location, name.c_str());
glVertexAttribPointer(location, width, GL_FLOAT, GL_FALSE, stride*sizeof(T),(GLvoid *)offset);
glEnableVertexAttribArray(location);
}
此代码无法在我的机器上正确呈现(ATI 5850,12.10驱动程序)并呈现以下内容:
如果我将属性绑定更改为:
program.bindVertexAttribs<float>(vbo1,0, "in_Position", 3, 6, 12);
program.bindVertexAttribs<float>(vbo1,1, "in_Color", 3, 6, 0);
我得到了正确的渲染:
这对我来说没有意义,因为位置是数据数组中的前3个浮点数,颜色是接下来的3个浮点数,然后再次定位,依此类推。我错过了一些明显的东西吗
答案 0 :(得分:2)
glBindAttribLocation(m_ID, location, name.c_str());
这没有任何作用;随意删除这一行,看看它有多少。
如果m_ID
是一个链接的程序对象(如果不是,那么你的代码就更没意义了。除非你使用VAO来捕获你的属性数组状态),否则这个函数将没有真实的效果。 glBindAttribLocation
仅在链接之前工作。链接后无法更改属性绑定。因此,使用程序的每个对象都需要使用相同的属性。
您应establish a proper convention for your vertex attribute names.创建任何程序时,应在链接之前将约定应用于程序。这样,您知道in_position
始终是属性0,例如。您无需通过毫无意义的glGetAttribLocation
电话查询。而且你不会想做你在这里做的事情,这是行不通的。