2

OpenGLでこれを取得しました(短縮コード)

void Mesh::CreateBuffer() { 
    glBindBuffer( GL_ARRAY_BUFFER, m_Buffers[POS_VB] );
    glBufferData( GL_ARRAY_BUFFER, sizeof(Positions[0] /*vec3*/) * iVerticeNum, &Positions[0], GL_STATIC_DRAW );
    glEnableVertexAttribArray( POSITION_LOCATION );
    glVertexAttribPointer( POSITION_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0 );

    // Fill index buffer.
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_Buffers[INDEX_BUFFER] );
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices[0] /*unsigned int*/) * iIndiceNum, &Indices[0], GL_STATIC_DRAW );

}

void Mesh::Render() {

    // bind vertex arrays here!
    .....

    glDrawElements( GL_TRIANGLES, this->NumIndices, GL_UNSIGNED_INT, 0);
    ....
}

上記のコードは私のエンジンで完全に機能しています。しかし、Metal API に移植することを決めたとき、いくつかの問題が発生しました。インデックス データを使用してモデルの半分をレンダリングするだけで、メッシュにはグループがなく、単純なメッシュです。しかし、頂点データ ( drawPrimitives ) を使用してレンダリングしようとすると、正常にレンダリングされます。

メッシュの初期化とレンダリングに使用している Metal コードは次のとおりです。

    INIT
    ....
    // Initialize mesh.
    MetalMesh mesh;

    mesh.vertexBuffer = [MetalDataBase->device newBufferWithBytes:Positions/* Vertice data */
                                            length:sizeof(vec3) * iNumVertices
                                           options:MTLResourceOptionCPUCacheModeDefault];
    mesh.indexBuffer = [MetalDataBase->device newBufferWithBytes:Indices
                                           length:sizeof(unsigned int) * iNumIndices
                                          options:MTLResourceOptionCPUCacheModeDefault];

    DRAW
    // Drawing..
    [MetalDataBase->commandEncoder setVertexBuffer:metalResource->metalMeshes[index].vertexBuffer offset:0 atIndex:0];

    // DrawPrimitives renders mesh **fine**, as it should.
    //[MetalDataBase->commandEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:iVerticeNum]; 

    // But it doesn't, it just renders half of model,
    // while **iIndiceNum** is right number with its data.
    [MetalDataBase->commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle indexCount:iIndiceNum indexType:MTLIndexTypeUInt32 indexBuffer:metalResource->metalMeshes[index].indexBuffer indexBufferOffset:0];
4

1 に答える 1