2014-02-06 2 views
2

Я использую OpenGL ES 2.0 и используя буфер трафарета. Ниже приведен код из простой пробной версии Stencil Buffer, которую я сделал. Трафайлинг работает только на одном устройстве.Буфер OpenGL ES Stencil, не работающий на определенных устройствах

устройства заключаются в следующем:

Android 4.2.2, PowerVR SGX 544MP (GPU), Allwinner А10 таблетки. (Stencil Buffer отлично работает на этом устройстве)

Android 4.1.2, Adreno 225 (GPU), Galaxy S III Phone. (Буфер Stencil не работает, некоторые редко мерцают с призрачным изображением трафарета.

Android 4.2.2, планшет Mali-400MP (GPU), планшет Rockchip rk30sdk (при первоначальном тестировании Buffer Stencil не работал, после многих изменяет теперь, кажется, работает, статус сомнителен. Конкретные изменения, которые устранены в колёсах Трафарет буфера неизвестных на данный момент)

то же самое последнее .apk дал вышеприведенные результаты.

Application «OpenGL 3D Showcase» из «Play Store» был запущен на всех трех устройствах, а «showcase» # 18 «Stencil Buffer Shadows» [OGL 1.1] отлично работает без сообщений об ошибках. Исходный код снабжен приложением и был просмотрен безрезультатно.

Ниже мой Трафарет код:

public void onDrawFrame(GL10 glUnused) { 
    // Clear the rendering surface. 
    glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

    multiplyMM(viewProjectionMatrix, 0, projectionMatrix, 0, viewMatrix, 0); 

    invertM(invertedViewProjectionMatrix, 0, viewProjectionMatrix, 0); 

    //Start using the stencil 
    glEnable(GL_STENCIL_TEST); 
    //Disable rendering to the color buffer 
    glColorMask(false, false, false, false); 


    //Place a 1 where rendered 
    glStencilFunc(GL_ALWAYS, 1, 1); 

    //Replace where rendered 
    glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 

    glDisable(GL_DEPTH_TEST); 

    glStencilMask(0xFF);//value used when writing to stencil buffer  

    // draw stencil triangle 
    rotateObjectInScene(0.0f, 0.0f, 0.0f);//x,y,z Object is rottated one full rotation ever 3 seconds within 
    colorProgram.useProgram(); 
    colorProgram.setUniforms(modelViewProjectionMatrix, 0f, 0f, 1f); 
    DemoTriangleStencilObj.bindData(colorProgram); 
    DemoTriangleStencilObj.draw(); 

    //Reenable color 
    glColorMask(true, true, true, true); 
    //Where a 1 was not rendered 
    glStencilFunc(GL_EQUAL, 1, 1);//GL_EQUAL GL_NOTEQUAL 
    //Keep the pixel 
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

    glStencilMask(0x00);//disable writing to stencil buffer by setting value used to 0. 

    positionObjectInScene1(0.0f, 0.0f, 0.0f);//leave image/object fixed in center of screen 
    textureProgram1.useProgram(); 
    textureProgram1.setUniforms(modelViewProjectionMatrix, texture_opengl); 
    openglImageDemoObj.bindData(textureProgram1); 
    openglImagerectanDemoObj.draw(); 

    //Finished using stencil 
    glDisable(GL_STENCIL_TEST); 

} 

Init:

public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

} 

public void onSurfaceChanged(GL10 glUnused, int width, int height) { 
    // Set the OpenGL viewport to fill the entire surface. 
    glViewport(0, 0, width, height); 

    // Landscape 
    orthoM(projectionMatrix, 0, -1, 1, -1f, 1f, -1f, 20f); 

    setLookAtM(viewMatrix, 0, 0f, 2.0f, 0.1f, 0.0f, 0f, 0f, 0f, 1f, 0f); 

} 

Init2:

Все прокомментировал вызовы '' setEGLConfigChooser были опробованы.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Remove title bar 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    //Remove notification bar 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    //setContentView(R.layout.activity_fist_open_glproject_aactivity); 
    glSurfaceView = new GLSurfaceView(this); 
    final TheSurfaceRenderer theSurfaceRenderer = new TheSurfaceRenderer(this); 

    this.getApplicationContext(); 
    final ActivityManager activityManager = 
      (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    final ConfigurationInfo configurationInfo = 
      activityManager.getDeviceConfigurationInfo(); 
    //final boolean supportsEs2 = false;//configurationInfo.reqGlEsVersion >= 0x20000; 
    final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; 

    if (supportsEs2) { 
     // Request an OpenGL ES 2.0 compatible context. 
     glSurfaceView.setEGLContextClientVersion(2); 

     //glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);//when use emulator, may be needed. 
     glSurfaceView.setEGLConfigChooser(new MultiSampleConfigChooser()); 
     //glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 8); 
     //glSurfaceView.setEGLConfigChooser(5,6,5,0,24,8); 
     //glSurfaceView.setEGLConfigChooser(5,6,5,0,16,8); 
     //glSurfaceView.setEGLConfigChooser(5,6,5,8,16,8); 

     // Assign our renderer. 
     //glSurfaceView.setRenderer(new AirHockeyRenderer(this)); 
     glSurfaceView.setRenderer(theSurfaceRenderer); 
     rendererSet = true; 
     //Toast.makeText(this, "Renderer started", Toast.LENGTH_LONG).show(); 
    } else { 
     Toast.makeText(this, "This device does not support OpenGL ES 2.0.", 
     Toast.LENGTH_LONG).show(); 
     return; 
    } 

    setContentView(glSurfaceView); 
} 

Любые идеи для отслеживания проблемы? В любом случае, где бы я мог получить помощь? (Если нужно, можете связаться с MFG/Android/Google, чтобы получить меня где-нибудь?)

+0

Любые новости по этому вопросу? На некоторых устройствах есть аналогичная проблесковая проблема. – Veljko

ответ

0

В коде, который вы указали, вы устанавливаете glStencilMask (0xFF), а затем вы выполняете glStencilMask (0x00). OpenGL - это конечный автомат, поэтому все, что вы задали, является текущим значением - даже когда вы очищаете. Значение маски трафарета по умолчанию равно 255, поэтому ваш glClear работает в первом кадре. Но после этого трафаретная маска равна 0 (потому что вы устанавливаете ее таким образом), и поэтому буфер трафарета НЕ очищается. Делайте это в верхней части вашей функции:

public void onDrawFrame(GL10 glUnused) { 
    // Clear the rendering surface. 
    glStencilMask(0xFF); 
    glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
    ... 
} 

Функция glStencilMask устанавливает маску записи - очистка является операцией записи, так что вы должны, как правило, установить все биты трафарета для записи в состоянии при очистке.

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