1

テクスチャを使って立方体を描きたいです。

void OperateWithMainMatrix(ESContext* esContext, GLfloat offsetX, GLfloat offsetY, GLfloat offsetZ) {

UserData *userData = (UserData*) esContext->userData;
ESMatrix modelview;
ESMatrix perspective;
    //Manipulation with matrix 
    ...
    glVertexAttribPointer(userData->positionLoc, 3, GL_FLOAT, GL_FALSE, 0, cubeFaces);
    //in cubeFaces coordinates verticles cube
    glVertexAttribPointer(userData->normalLoc, 3, GL_FLOAT, GL_FALSE, 0, cubeFaces);
    //for normals (use in fragment shaider for textures)

    glEnableVertexAttribArray(userData->positionLoc);
    glEnableVertexAttribArray(userData->normalLoc);

    // Load the MVP matrix
    glUniformMatrix4fv(userData->mvpLoc, 1, GL_FALSE, 
                       (GLfloat*)&userData->mvpMatrix.m[0][0]);

    //Bind base map
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_CUBE_MAP, userData->baseMapTexId);

    //Set the base map sampler to texture unit to 0
    glUniform1i(userData->baseMapLoc, 0);

   // Draw the cube
    glDrawArrays(GL_TRIANGLES, 0, 36);
   }

(座標変換はOperateWithMainMatrix()にあります)次に、Draw()関数が呼び出されます。

void Draw(ESContext *esContext)
{
   UserData *userData = esContext->userData;
   // Set the viewport
   glViewport(0, 0, esContext->width, esContext->height);

   // Clear the color buffer
   glClear(GL_COLOR_BUFFER_BIT);

   // Use the program object
   glUseProgram(userData->programObject);

  OperateWithMainMatrix(esContext, 0.0f, 0.0f, 0.0f);

  eglSwapBuffers(esContext->eglDisplay, esContext->eglSurface);
}

これは正常に機能しますが、複数のキューブを描画しようとすると(たとえば次のコード):

void Draw(ESContext *esContext)
{ ...

    // Use the program object
    glUseProgram(userData->programObject);

    OperateWithMainMatrix(esContext, 2.0f, 0.0f, 0.0f);
    OperateWithMainMatrix(esContext, 1.0f, 0.0f, 0.0f);
    OperateWithMainMatrix(esContext, 0.0f, 0.0f, 0.0f);
    OperateWithMainMatrix(esContext, -1.0f, 0.0f, 0.0f);
    OperateWithMainMatrix(esContext, -2.0f, 0.0f, 0.0f);
    eglSwapBuffers(esContext->eglDisplay, esContext->eglSurface);
}

側面が正面に重なっています。このプロセスは画像に示されています。 ここに画像の説明を入力してください

代替画像(色ときれいな画像付き): ここに画像の説明を入力してください

右側の立方体の側面は、中央の立方体の前面と重なっています。この効果を削除して、それなしでmiltipleキューブを表示するにはどうすればよいですか?

4

1 に答える 1

2

これを修正するには、深度バッファと呼ばれるものを利用する必要があります。これは、表面がより近い表面の上に描画されないようにする役割を果たします (立方体の側面が立方体の前面に表示されるなど)。

幸いなことに、そうするのにそれほど手間はかかりません。

  1. 初期化時に深度テストを有効にするglEnable(GL_DEPTH_TEST)
  2. glClear 呼び出しにビットを追加して、各フレームの深度バッファをクリアします。 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

この後、サーフェスがより近いサーフェスの上にポップすることはなくなります。

于 2012-10-02T15:51:40.643 に答える