0

raywenderlich.comでこのOpenGLおよびGLKitチュートリアルを変更しようとしていますが、頂点ごとの色情報を使用せず、サーフェス法線を使用して、wavefrontobjファイルから立方体をレンダリングしようとしています。しかし、レンダリングされるものは立方体のようには見えません。

objファイルを解析するために、objを通過し、頂点バッファー、インデックスバッファー、オブジェクト内の面の数、および変換行列の4つを含む構造体(Drawable)に情報を保存するメソッド(createDrawable)があります。物体。(ここにヘッダー.mファイルおよび.objファイルがあります。)

- (Drawable)createDrawable: (NSString *)objFileName {
    ......
    ......

    // Parsed obj and put info in vertexData and indices arrays.

    Drawable _drawable;

    _drawable.numFaces = numFaces;

    glGenBuffers(1, &_drawable.vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _drawable.vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData) * numFaces * 8, vertexData, GL_STATIC_DRAW);

    glGenBuffers(1, &_drawable.indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _drawable.indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices) * numFaces * 3, indices, GL_STATIC_DRAW);

    _drawable.matrix = GLKMatrix4Identity;
    _drawable.matrix = GLKMatrix4Translate(_drawable.matrix, 0.0f, 0.0f, 10.0f);

    return _drawable;
}

レンダリングには、オブジェクトのバッファーをバインドし、それらへのポインターを設定してから、glDrawElements(..)を使用してレンダリングする別のメソッド(renderDrawable)を使用しています。

- (void) renderDrawable: (Drawable)object {
    glBindBuffer(GL_ARRAY_BUFFER, object.vertexBuffer);
    glEnableVertexAttribArray(GLKVertexAttribPosition);        
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 0);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord1);
    glVertexAttribPointer(GLKVertexAttribTexCoord1, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 3);
    glEnableVertexAttribArray(GLKVertexAttribNormal);
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *) 5);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object.indexBuffer);
    glDrawElements(GL_LINES, sizeof(object.indexBuffer) * 3 * object.numFaces, GL_UNSIGNED_BYTE, (const GLvoid *) object.indexBuffer);
}

バッファ(ここに示されているcreateDrawableと.mファイルのrenderDrawableの一部)で何か問題が発生していると思いますが、それが何であるかがわかりません。

4

2 に答える 2

1

glVertexArrayPointer の「ストライド」パラメーターは、たとえば 8 * sizeof(float) に設定する必要があると思います (単一の頂点のサイズ)

glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const GLvoid *) 5);

ストライドが 0 の場合 - 属性が連続して保存されることを意味します...しかし、属性がインターリーブされているため、OpenGL にさらに情報を提供する必要があります。

別の問題: とは何sizeof(vertexData) * numFaces * 8ですか ... あるべきだと思います:sizeof(vertexData) * numFaces * 3

そしてインデックスバッファの場合:sizeof(indices) * numFaces * 3- そうあるべきだと思いますsizeof(int) * numFaces * 3

int - インデックスの型ですが、GL_BYTE があります (つまり、256 の異なるインデックスしか持てないということです!)

レンダリング時: glDrawArrays - インデックス バッファーがバインドされているため、最後のパラメーターを NULL に設定します。

于 2012-05-30T10:45:37.170 に答える
1

問題は、GL_TRIANGLES の代わりに GL_LINES を glDrawElements() に渡すことだと思います。

于 2012-05-30T10:40:42.360 に答える