2014-12-12 2 views
0

Hy, Я разрабатываю приложение на Android, и я нахожусь на этапе тестирования, и я пытаюсь использовать его на разных устройствах. Я разработал приложение на привязке 7.OpenGL ES 2.0 визуализировать текстуру на ARM MALI gpu

Когда я запускаю его на руке mali gpu device, рендеринг textrue начинает мигать/lagg как сумасшедший. Я использую GLES20.GL_POINTS в сгенерированной текстуре, если я устанавливаю размер точки в 1, он мигает, и похоже, что в нем есть артефакты, и если я установил размер точки на большее число, например 10, это означает «лагги», что иногда означает показывает текстуру от более раннего рендеринга.

Любая идея, что может вызвать это?

private void setupRenderToTexture() { 
    fb = new int[1]; 
    depthRb = new int[1]; 
    renderTex = new int[2]; 
    // generate 
    GLES20.glGenFramebuffers(1, fb, 0); 
    GLES20.glGenRenderbuffers(1, depthRb, 0); 
    GLES20.glGenTextures(1, renderTex, 0); 
    // create render buffer and bind 16-bit depth buffer 
    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthRb[0]); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, texW, texH); 
} 

Это мой воздавать textue метод:

private void createSmokeTexture() { 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]); 
    GLES20.glClearColor(0.48f, 0.48f, 0.48f, 0.0f); 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTex[0], 0); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, depthRb[0]); 
    //background counts 
    renderscriptSmokeStep_involke(); 

    GLES20.glUseProgram(mProgramSmoke); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture); 
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramSmoke, "u_MVPMatrix"); 
    mMVMatrixHandle = GLES20.glGetUniformLocation(mProgramSmoke, "u_Move"); 
    mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramSmoke, "u_Texture"); 
    smokeParticleSizeUniformHandle = GLES20.glGetUniformLocation(mProgramSmoke, "u_PointSize"); 
    maximumDensityHandler = GLES20.glGetUniformLocation(mProgramSmoke, "u_MaximumDensity"); 

    cellDensityHandle = GLES20.glGetAttribLocation(mProgramSmoke, "a_Age"); 
    smokeStartPositionHandle = GLES20.glGetAttribLocation(mProgramSmoke, "a_Position"); 

    Matrix.setIdentityM(mMoveMatrix, 0); 
    Matrix.translateM(mMoveMatrix, 0, positionX, positionY, 0); 
    Matrix.multiplyMM(mMoveMatrix, 0, Render.mModelMatrix, 0, mMoveMatrix, 0); 

    GLES20.glUniform1f(smokeParticleSizeUniformHandle, PARTICLE_SIZE); 
    GLES20.glUniform1f(maximumDensityHandler, MAXIMUM_DENSITY); 
    GLES20.glUniform1i(mTextureUniformHandle, 0); 
    GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMoveMatrix, 0); 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, Render.m2dProjectionMatrix, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, particlePosBuffer); 
    GLES20.glEnableVertexAttribArray(smokeStartPositionHandle); 
    GLES20.glVertexAttribPointer(smokeStartPositionHandle, 2, GLES20.GL_FLOAT, false, 0, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 

    GLES20.glEnableVertexAttribArray(cellDensityHandle); 
    GLES20.glVertexAttribPointer(cellDensityHandle, 1, GLES20.GL_FLOAT, false, 0, cellDensity); 

    // Draw the point. 
    GLES20.glDrawArrays(GLES20.GL_POINTS, 0, NUM_PARTICLES); 
} 

Это вызывается на ничью:

public void draw(){ 
    createSmokeTexture(); 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
    setTexture(renderTex[0]); 
    drawSmokeToScreen(); 
} 

Asdas

private void setTexture(int texture) { 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
      GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
      GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texW, texH, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); 
} 

И после этого я рисую его экран

private void drawSmokeToScreen() { 
    GLES20.glUseProgram(mProgramHandle); 
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix"); 
    mMVMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Move"); 
    positionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position"); 
    textureHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate"); 

    GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, Render.mModelMatrix, 0); 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, Render.m2dProjectionMatrix, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, fullDrawSurfice.getPositionDataIndex()); 
    GLES20.glEnableVertexAttribArray(positionHandle); 
    GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 0, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, fullDrawSurfice.getTextureDataIndex()); 
    GLES20.glEnableVertexAttribArray(textureHandle); 
    GLES20.glVertexAttribPointer(textureHandle, 2, GLES20.GL_FLOAT, false, 0, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6); 
} 
+0

Проверить наличие поддерживаемого размера. Используйте 'glGetFloatv (GL_ALIASED_POINT_SIZE_RANGE, ...)'. Реализации не требуются для поддержки размеров точек больше 1. Кроме того, люди, вероятно, не смогут много помочь с описанием проблемы.Это может быть ошибка драйвера или проблема в вашем коде, которая просто не обнаруживает каких-либо симптомов на других архитектурах. –

+0

@RetoKoradi Хорошо знать, что не требуется, я проверил, и это устройство поддерживает его. Вы правы, я закрою код за пару минут. И это мой у меня нет опыта разработки на разных архитектурах, поэтому я не знаю, что проверить – FaNaT

ответ

1

Похоже, что есть несколько проблем с заказом ваших звонков.

  1. В начале createSmokeTexture(), есть этот код последовательности:

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]); 
    GLES20.glClearColor(0.48f, 0.48f, 0.48f, 0.0f); 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, 
         GLES20.GL_TEXTURE_2D, renderTex[0], 0); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, 
         GLES20.GL_RENDERBUFFER, depthRb[0]); 
    

    Здесь фреймбуфера очищается, прежде чем он полностью настроить путем присоединения Render Targets с glFramebufferTexture2D() и glFramebufferRenderbuffer() вызовов. Скорее всего, это проблема только для первого кадра, потому что, по крайней мере, в приведенном здесь коде цели рендеринга никогда больше не присоединяются. После этого вызовы просто излишни. Было бы гораздо лучше прикрепить цели рендеринга во время установки.

  2. В конце setTexture():

    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texW, texH, 0, 
         GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); 
    

    На основании последовательности в draw(), это называется после рендеринга кО завершен, и перед использованием полученной текстуры, чтобы привлечь к главному фреймбуфера. Однако этот вызов glTexImage2D() в основном стирает содержимое текстуры, которое было создано рендерингом FBO.

Чтобы исправить обе эти проблемы, удалите glFramebufferTexture2D() и glFramebufferRenderbuffer() из первой кодовой последовательности, и все, кроме glActiveTexture() и glBindTexture() звонков от setTexture(). Все это должно идти в setupRenderToTexture() функция, которая затем становится:

GLES20.glGenTextures(1, renderTex, 0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[0]); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
     GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
     GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
     GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, 
     GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texW, texH, 0, 
     GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); 

// create render buffer and bind 16-bit depth buffer 
GLES20.glGenRenderbuffers(1, depthRb, 0); 
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthRb[0]); 
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, 
     GLES20.GL_DEPTH_COMPONENT16, texW, texH); 

GLES20.glGenFramebuffers(1, fb, 0); 
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, 
     GLES20.GL_TEXTURE_2D, renderTex[0], 0); 
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, 
     GLES20.GL_RENDERBUFFER, depthRb[0]); 
+0

большое спасибо – FaNaT

Смежные вопросы