4

私は最近、頂点バッファオブジェクトを機能させることに大きな進歩を遂げました。そこで、Element配列に移り、そのように実装すると、objから頂点と面データをロードできると考えました。

私はC++でファイルを読むのが苦手なので、Pythonドキュメントを作成してobjを解析し、2つの別々のtxtを作成して、頂点配列と面のインデックスを取得し、コードに直接貼り付けました。これは6000行に似ていますが、(コンパイルエラーなしで)機能します。そして、これがどのように見えるかです

彼らは間違っていると思います。わからない。バッファオブジェクトに対して機能する法線またはテクスチャがまだないため、頂点と面の順序はobjから抽出されただけでは変更されません。キューブを見ればいいのですが、実際はそうではありません。

レンダリングコードは次のとおりです

void Mesh_handle::DrawTri(){
    glBindBuffer(GL_ARRAY_BUFFER,vertexbufferid);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,elementbufferid);
    int index1=glGetAttribLocation(bound_program,"inputvertex");
    int index2=glGetAttribLocation(bound_program,"inputcolor");
    int index3=glGetAttribLocation(bound_program,"inputtexcoord");

    glEnableVertexAttribArray(index1);
    glVertexAttribPointer(index1,3,GL_FLOAT,GL_FALSE,9*sizeof(float),0);

    glEnableVertexAttribArray(index2);
    glVertexAttribPointer(index2,4,GL_FLOAT,GL_FALSE,9*sizeof(float),(void*)(3*sizeof(float)));

    glEnableVertexAttribArray(index3);
    glVertexAttribPointer(index3,2,GL_FLOAT,GL_FALSE,9*sizeof(float),(void*)(7*sizeof(float)));

    glDrawArrays(GL_TRIANGLE_STRIP,0,elementcount);
    //glDrawElements(GL_TRIANGLE_STRIP,elementcount,GL_UNSIGNED_INT,0);
}

情報をファイルに書き込むだけの私のPythonパーサー:source

オブジェクトはLeagueofLegendsのEzrealです

私が顔を間違って読んでいるのか、それとも私が思っていたものでさえないのかはわかりません。私はGL_TRIANGLE_STRIP何か他のものを使うと思いますか?ヒントや詳細情報のリクエスト。

4

3 に答える 3

4

objファイルのインデックスは1ベースであるため、OpenGLで使用するには、すべてのインデックスから1を引く必要があります。

于 2012-08-28T10:04:12.657 に答える
2

まず、Andreas が述べたように、.obj ファイルは 1 ベースのインデックスを使用するため、それらを 0 ベースのインデックスに変換する必要があります。

2番:

glDrawArrays(GL_TRIANGLE_STRIP,0,elementcount);
//glDrawElements(GL_TRIANGLE_STRIP,elementcount,GL_UNSIGNED_INT,0);

.obj ファイルで与えられたフェイス リストを三角形のストリップに変換する特別な作業を行わない限り、三角形のストリップはありません。GL_TRIANGLESストリップではなく、レンダリングする必要があります。

于 2012-08-28T10:22:40.077 に答える