Запрос окклюзии OpenGL ES 3.0 всегда приводит к ложному результату

Я пытаюсь выполнить запрос окклюзии для двух треугольников, расположенных на разных Z в Android OpenGLES 3.0.

Вот как я использую:

In onSurfaceCreated():
     GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
     GLES30.glEnable(GLES30.GL_DEPTH_TEST);     // enabling Deoth test

In onDrawFrame(): 
     GLES30.glClear(GLES30.GL_DEPTH_BUFFER_BIT | GLES30.GL_COLOR_BUFFER_BIT);
     Matrix.setIdentityM(mModelMatrix, 0);
     Matrix.setIdentityM(mModelMatrix, 0);
     Matrix.translateM(mModelMatrix, 0, 0.0f, 0.0f, 1.0f); // translating at some differnt z = 1.0
     drawTriangle(mTriangle1Vertices);                      // method for drawing traingle1

     Matrix.setIdentityM(mModelMatrix, 0);
     Matrix.translateM(mModelMatrix, 0, 0.0f, 0.0f, 0.0f); // other triangle at Z = 0.0

// Occlusion Query for Triangle2
    IntBuffer testBox = IntBuffer.allocate(1);
    IntBuffer hasBeenTested = IntBuffer.allocate(1);
    IntBuffer theParams = IntBuffer.allocate(1);

    GLES30.glGenQueries(1, testBox);
    int retid = testBox.get(0);
    GLES30.glBeginQuery(GLES30.GL_ANY_SAMPLES_PASSED, retid);

    drawTriangle(mTriangle2Vertices);         // drawing traingle 2 ie at Z = 0.0

    GLES30.glEndQuery(retid);
    int retQuerry = testBox.get(0);
    GLES30.glGetQueryObjectuiv(retid, GLES30.GL_QUERY_RESULT, theParams);

    int isHidden = theParams.get(0);              // THIS IS ALWAYS ZERO even if  I REVERSE the Z- translation of the triangles
    Log.i("occ", " isHiddedn " +  isHidden);        

    GLES30.glDeleteQueries(1, testBox);

В методе drawTriangle() я просто передаю цвет, вершину и MVP uinform в вершинный шейдер.

На экране моего устройства я вижу, что TRAINGLE 2 полностью перекрывается ТРЕУГОЛЬНИКОМ 1. Также, если я обращаю Z-перемещение, другой треугольник полностью перекрывается. Но все же результаты теста (isHidden) остаются прежними? Где я ошибаюсь? Как правильно провести тест на окклюзию?


person user2110239    schedule 05.08.2014    source источник


Ответы (1)


Аргументом glEndQuery() является цель, а не идентификатор запроса. Это то же самое, что и первый аргумент соответствующего glBeginQuery(). В вашем случае это будет:

GLES30.glBeginQuery(GLES30.GL_ANY_SAMPLES_PASSED, retid);
drawTriangle(mTriangle2Vertices);
GLES30.glEndQuery(GLES30.GL_ANY_SAMPLES_PASSED);
person Reto Koradi    schedule 06.08.2014