1

即時モードを使用すると正しく描画されますが、同じ頂点を GPU に渡したり、ポイントしたりしても機能しません。

頂点を保持する位置バッファがあります:

std::vector<glm::vec3> posbuf;

およびそのためのインデックス。

即時モード:

for (unsigned int i =0; i < indices.size(); i++) {
    glBegin(GL_TRIANGLES);
    glVertex3f(posbuf[indices[i].index[0]].x, posbuf[indices[i].index[0]].y, posbuf[indices[i].index[0]].z);
    glVertex3f(posbuf[indices[i].index[1]].x, posbuf[indices[i].index[1]].y, posbuf[indices[i].index[1]].z);
    glVertex3f(posbuf[indices[i].index[2]].x, posbuf[indices[i].index[2]].y, posbuf[indices[i].index[2]].z);
    glEnd();
    }

これは頂点属性コードです:

glEnableVertexAttribArray(GL_ATTRIB_POS);
glVertexAttribPointer(GL_ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, 0,&posbuf[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indVBO);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(GL_ATTRIB_POS);

およびそのためのシェーダー:

#version 120
attribute vec3 position;
void main()
{
    vec4 finalv=vec4(position, 1.0);
    gl_Position = gl_ModelViewProjectionMatrix * vec4(finalv.xyz,1.0);
}

[frag]
#version 120


void main()
{
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}

即時結果:ここに画像の説明を入力

シェーダーの結果: ここに画像の説明を入力

何が問題なのかわかりません。また、glm::value_ptr を使用して posbuf を渡そうとしましたが、すべて同じ結果が得られました。私は #version 140 までの glsl、opengl 3.3 をサポートする fedora 18 を使用しています。

編集 :

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle) * indices.size(), &indices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

struct Triangle {
int index[3];
};
4

1 に答える 1

2

indicesベクトルには、それぞれ 3 つのインデックスで構成される完全な三角形が含まれているようです。しかし、次に、描画する要素の数としてglDrawElements使用します。indices.size()ただしglDrawElements、プリミティブの数ではなく、インデックスの数を使用するため、三角形の 2/3 が失われます。むしろそうあるべき

glDrawElements(GL_TRIANGLES, indices.size() * 3, GL_UNSIGNED_INT, 0);

(これ以上の混乱を避けるためindicesに名前を に変更する必要がありますtriangles。ちなみに、indexおそらく OpenGL に約束されているはずです。合理的なシステムでは、 s とs のunsigned int[3]間に表現上の違いはありませんが、伝えながら使用するのは少し一貫性がありませんOpenGLです。)intunsigned intintunsigned int

于 2013-06-24T13:43:09.263 に答える