1

ここで何が問題なのかわかりません。法線以外はすべて正常に機能しています。頂点配列を使用すると、モデルは完璧に見えますが、VBO に切り替えると、頂点法線のためにモデルが悪化します。私はそれを修正するために多くの時間を費やしましたが、何が問題なのかわかりません。VBO の生成は完璧なようです。しかし、まだわかりません。何か案が?

#define BUFFER_OFFSET(i) ((char *)NULL + (i))


void InitVBO(){

glGenBuffers(1, &vboNormID); 
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, VertNormals);
glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));

glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, p_VERTICES);
glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));


glGenBuffers(1, &indexVBOID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(GLFace)*nb_Faces, p_indices);

//glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, p_indices, GL_DYNAMIC_DRAW);}

レンダリングコードに従います。VBO + 頂点配列 頂点配列は完璧に機能しています。頂点法線でモデルの完璧な形状を見ることができますが、VBO では頂点法線に問題があります。BUFFER_OFFSET(12) で何か間違ったことをしていると思います。

void RenderTringularModel(GLvoid){
if(VertNormals && !MESH_SMOOTH)
{
    glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
    glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);

    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));
    glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));

    glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glPopClientAttrib();

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

}
else
{
    //glShadeModel (GL_FLAT);
    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), p_VERTICES);
    glNormalPointer(GL_FLOAT,  sizeof(GLpoint), VertNormals);
    glDrawElements(GL_TRIANGLES, 3*nb_Faces, GL_UNSIGNED_INT, p_indices);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glPopClientAttrib();
}

}

更新 1: InitVBO について話していると思います..その時点で私は間違っていました。これはどうですか...しかし、それも機能していません..実際には問題です..多くの方法で、InitVBO()..で頂点法線をバインドしようとしましたが、結果は毎回同じです。

    glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, p_VERTICES);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, sizeof(GLpoint)*nb_Vertices, VertNormals);  
glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));
glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));

更新 2: OK ... 頂点法線 (vboNormID) をバインドしません。私はそれを捨てています。今大丈夫 ?これで動作するはずです..実際には、その方法ですべてを行いました..頂点法線を vboVertID や vboNormID などとバインドします..しかし、すべての単一の数学が機能しているわけではありません..

    void RenderTringularModel(GLvoid){
if(VertNormals && !MESH_SMOOTH)
{
    glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);

    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));
    glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));

    glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

更新 3:

誰が私に BUFFER_OFFSET() を使うように言ったのかわかりません... ただがらくた.. 今は修正しましたが、このばかげた BUFFER_OFFSET() なしで正常に動作するようになりました..修正されたコードは次のように本当に簡単です:

void InitVBO(){
glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, p_VERTICES, GL_DYNAMIC_DRAW);

glGenBuffers(1, &vboNormID);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, VertNormals, GL_DYNAMIC_DRAW);

glGenBuffers(1, &indexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, p_indices, GL_DYNAMIC_DRAW);}


void RenderTringularModel(GLpoint *P, GLpoint *Vn, GLFace *T, int nbF){
glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, 0);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glPopClientAttrib();}

これらのバッファをリアルタイムで更新する方法を教えてください。つまり、データ全体、法線、頂点、三角形をリアルタイムで更新する必要があるということです。たとえば、三角形を細分化した後、頂点と法線を使用して三角形のバッファを更新する必要があります。また、モデルのカット シミュレーション中に、頂点の位置と法線を更新する必要があるため、更新する必要があります。その時点でのバッファも..この種の問題に対して何をすべきか教えてください。どうすれば補うことができますか?バッファを削除して再生成する必要がありますか? はいの場合、どのように?

4

0 に答える 0