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 つの float であり、色は次の 3 つの float であり、その後再び位置付けられるなど、これは私には意味がありません。明らかな何かが欠けていますか?

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 に答える