1

我试图弄清楚为什么使用的偏移值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 个浮点数,然后再次定位,依此类推。我错过了一些明显的东西吗?

4

1 回答 1

2
glBindAttribLocation(m_ID, location, name.c_str());

这无济于事;随意删除这条线,看看它做了多少。

如果m_ID是一个链接的程序对象(如果不是,那么你的代码就更没有意义了。除非你使用 VAO 来捕获你的属性数组状态),那么这个函数将没有真正的效果。glBindAttribLocation在链接之前有效。链接后无法更改属性绑定。所以每个使用程序的对象都需要使用相同的属性。

您应该为您的顶点属性名称建立适当的约定。当您创建任何程序时,您应该在链接之前将您的约定应用于该程序。这样,您就知道它in_position总是属性 0,例如。你不必用毫无意义的glGetAttribLocation电话来查找它。而且你不会被诱惑去做你在这里做的事情,这是行不通的。

于 2012-11-26T02:21:38.777 回答