2015-04-16 21 views
0

我試圖在程序找到目標時用png圖像替換茶壺。我使用vuforia 4.Nexus設備中的OpenGL2.0渲染問題(Android中的Vuforia)

這是我使用的代碼:

private void renderFrame() { 

    State state = mRenderer.begin(); 
    mRenderer.drawVideoBackground(); 
    if (Renderer.getInstance().getVideoBackgroundConfig().getReflection() == VIDEO_BACKGROUND_REFLECTION.VIDEO_BACKGROUND_REFLECTION_ON) 
     GLES20.glFrontFace(GLES20.GL_CW); // Front camera 
    else 
     GLES20.glFrontFace(GLES20.GL_CCW); // Back camera 

    if (state.getNumTrackableResults() == 0) 
     displayMessage("nothing"); 
    // did we find any trackables this frame? 
    for (int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++) { 

     TrackableResult result = state.getTrackableResult(tIdx); 
     Trackable trackable = result.getTrackable(); 
     ImageTarget itarget = (ImageTarget) trackable; 

     Log.d("USER", itarget.getName()); 
     Matrix44F modelViewMatrix_Vuforia = Tool 
       .convertPose2GLMatrix(result.getPose()); 
     float[] modelViewMatrix = modelViewMatrix_Vuforia.getData(); 
     float[] modelViewProjection = new float[16]; 
     Matrix.translateM(modelViewMatrix, 0, 0.0f, 0.0f, 
       OBJECT_SCALE_FLOAT); 
     Matrix.scaleM(modelViewMatrix, 0, OBJECT_SCALE_FLOAT, 
       OBJECT_SCALE_FLOAT, OBJECT_SCALE_FLOAT); 
     Matrix.translateM(modelViewMatrix, 0, 0.0f, 0.0f, 0.0f); 
     Vec3F targetSize = itarget.getSize(); 
     Matrix.scaleM(modelViewMatrix, 0, targetSize.getData()[0], 
       targetSize.getData()[1], 1.0f); 
     Matrix.multiplyMM(modelViewProjection, 0, vuforiaAppSession 
       .getProjectionMatrix().getData(), 0, modelViewMatrix, 0); 

     GLES20.glUseProgram(shaderProgramID); 

     if (!mActivity.isExtendedTrackingActive()) { 

      GLES20.glVertexAttribPointer(vertexHandle, 3, GLES20.GL_FLOAT, 
        false, 0, mTeapot.getVertices()); 
      GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, 
        false, 0, mTeapot.getNormals()); 
      GLES20.glVertexAttribPointer(textureCoordHandle, 2, 
        GLES20.GL_FLOAT, false, 0, mTeapot.getTexCoords()); 
      GLES20.glEnableVertexAttribArray(vertexHandle); 
      GLES20.glEnableVertexAttribArray(normalHandle); 
      GLES20.glEnableVertexAttribArray(textureCoordHandle); 

      int index = 0; 
      if (itarget.getName().equals("ERMITA-2-1")) { 
       index = 1; 
      } 
      GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 
        mTextures.get(index).mTextureID[0]); 
      GLES20.glUniform1i(texSampler2DHandle, 0); 
      // pass the model view matrix to the shader 
      GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, 
        modelViewProjection, 0); 
      GLES20.glEnable(GLES20.GL_BLEND); 
      GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, 
        GLES20.GL_ONE_MINUS_SRC_ALPHA); 
      GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, 
        GLES20.GL_UNSIGNED_SHORT, mTeapot.getIndices()); 
      GLES20.glDisable(GLES20.GL_BLEND); 

      lastTrackableId = -1; 

      GLES20.glDisableVertexAttribArray(vertexHandle); 
      GLES20.glDisableVertexAttribArray(normalHandle); 
      GLES20.glDisableVertexAttribArray(textureCoordHandle); 
      // 
     } else { 
      GLES20.glDisable(GLES20.GL_CULL_FACE); 
      GLES20.glVertexAttribPointer(vertexHandle, 3, GLES20.GL_FLOAT, 
        false, 0, mBuildingsModel.getVertices()); 
      GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, 
        false, 0, mBuildingsModel.getNormals()); 
      GLES20.glVertexAttribPointer(textureCoordHandle, 2, 
        GLES20.GL_FLOAT, false, 0, 
        mBuildingsModel.getTexCoords()); 

      GLES20.glEnableVertexAttribArray(vertexHandle); 
      GLES20.glEnableVertexAttribArray(normalHandle); 
      GLES20.glEnableVertexAttribArray(textureCoordHandle); 

      GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 
        mTextures.get(0).mTextureID[0]); 
      GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, 
        modelViewProjection, 0); 
      GLES20.glUniform1i(texSampler2DHandle, 0); 
      GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 
        mBuildingsModel.getNumObjectVertex()); 

      SampleUtils.checkGLError("Renderer DrawBuildings"); 
     } 
     SampleUtils.checkGLError("Render Frame"); 
    } 

    GLES20.glDisable(GLES20.GL_DEPTH_TEST); 
    // GLES20.glDisable(GLES20.GL_BLEND); 
    mRenderer.end(); 
} 

它的工作原理與像銀河S2和通用片一些設備。我遇到的問題引起了以下設備:

Nexus 4:Android 5.1:識別目標(打印日誌)和一些奇怪的東西出現在屏幕上。它似乎設法渲染紋理,但它立即消失。

Nexus 10:Android 5.1:識別目標(打印日誌),但什麼都不做,根本沒有渲染。沒有錯誤消息。

壹加壹:Android 4.4的:同的Nexus 10

任何想法?

我已經在Vuforia開發論壇上發佈了這個問題,但它似乎是渲染問題而不是Vuforia問題。

回答

0

解決通過添加:就在renderFrame方法之初

GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);