1

ブラックベリー 10 OS でナビゲーション システム用のカスタム マップを開発しています。これまでのところ、OpenGL ES 1.1 で動作するようにカスケードをセットアップしました。現時点では、以下に示すように、ループでいくつかのタイルを描画できます。

void MapView::render() {
//Typical render pass
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//First render background and menu if it is enabled
    glViewport(0, 0, (int) screenWidth, (int) screenHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(0.0f, screenWidth / screenHeight, 0.0f, 1.0f, -1.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glScalef(1.0f / screenHeight, 1.0f / screenHeight, 1.0f);

glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    for (i = 0.0; i <= 100.0, i += 256.0){
       for (j = 0.0; j <= 100.0, j += 256.0){
            drawTile(image_texure, i, j, 0.0f, 256.0f, 1.0f, 1.0f);
       }   
    }

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);

    //Use utility code to update the screen
swapBuffers();
    }

   void MapView::drawTile(GLuint tile_texture, float x, float y, float z,floatd,float   tex_x, float tex_y)
   {
         //vertices for the grid.
     GLfloat gridVertices[] = {x,y + d,z,    x + d,y + d,z,     x + d, y, z,  x,y,z};

         //coordinates for the tile testure.  
     GLfloat tex_coord[] = {0.0f, tex_y,   0.0f, 0.0f,   tex_x, tex_y,   tex_x, 0.0f};  

     glVertexPointer(3, GL_FLOAT, 0, gridVertices);
     glTexCoordPointer(2, GL_FLOAT, 0, tex_coord);
     glBindTexture(GL_TEXTURE_2D, tile_texture);
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

   }

オンラインでいくつかの記事を読んだ後、私はOpenGLの初心者であり、頂点バッファオブジェクトとインデックスを操作し、テクスチャをバッファリングすることは、パフォーマンスを大幅に向上させるため、はるかに優れたソリューションです。C++ でグリッド タイリングおよびテクスチャをグリッドにマッピングするために VBO を使用する方法について親切にガイドしてください。サンプル コードまたは任意のチュートリアルは、よりよく説明します。私の投稿のコードがうまく並べられていない場合は、ご容赦ください.

ありがとう。

編集

iOSのドキュメントとVBOを読んだ後、OpenGLの例だけを読んだ後、ここに投稿するコードのように次のことを行いました。私が今抱えている問題は、頂点配列が期待どおりにレンダリングされるのとは対照的に、VBOが何もレンダリングしないことです。

以下は、描画用の VBO とコード、および頂点とインデックスの構造体を作成するメソッドです。createVertexBuffers() は initialize() で呼び出され、drawTileGrids() は render() で呼び出されます。

typedef struct
{
   float x, y, z; //vertex
}  VertexStruct;

typedef struct
{
float tex_x, tex_y; //texture coordinates
} TexStruct;

typedef struct
{
VertexStruct position;
TexStruct texCoord;
} MeshVertex;

float d = 256.0;

MeshVertex meshVertices [] =
{

    {{0.0, 0.0 + d, 0.0}     , {0.0, 1.0}},
    {{0.0, 0.0, 0.0}         , {0.0, 0.0}},
    {{0.0 + d, 0.0 + d, 0.0} , {1.0, 1.0}},
    {{0.0 + d, 0.0, 0.0}     , {1.0, 0.0}}
};

GLushort meshIndices [] =
{
    0, 1, 2, 3
};

void MapView::createVertexBuffers()
{
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(meshVertices), meshVertices, GL_STATIC_DRAW);

        glGenBuffers(1, &indexBuffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(meshIndices), meshIndices, GL_STATIC_DRAW);

        qDebug()  << "Vertex buffers created. ";
 }

void MapView::drawTileGrids()
{
    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glVertexPointer(3, GL_FLOAT,  sizeof(VertexStruct), BUFFER_OFFSET(0));

    glClientActiveTexture(GL_TEXTURE0);
        //The starting point of texcoords, 24 bytes away
    glTexCoordPointer(2, GL_FLOAT, sizeof(VertexStruct), BUFFER_OFFSET(24)); 


    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

    glBindTexture(GL_TEXTURE_2D, image_texure);

    glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); 

    //glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glDisable(GL_BLEND);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    //glDisable(GL_TEXTURE_2D);
   }
4

0 に答える 0