glDepthMask, кажется, не работает, как ожидалось? - PullRequest
1 голос
/ 08 апреля 2019

Я рендерил два треугольника: один - красный меньший треугольник с отрицательным значением глубины (координата z вершины), другой - больший треугольник с положительным значением глубины.

float smallVertices[] = {
        //position          color
       -0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0, 1.0f,// left
        0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0, 1.0f,// right
        0.0f,  0.5f, -0.5f, 1.0f, 0.0f, 0.0, 1.0f// top
    };

float bigVertices[] = {
        //position          color
        -1.0f, -1.0f, 0.5f, 0.0f, 0.0f, 1.0, 1.0f,// left
         1.0f, -1.0f, 0.5f, 0.0f, 0.0f, 1.0, 1.0f,// right
         0.0f,  1.0f, 0.5f, 0.0f, 0.0f, 1.0, 1.0f// top
    };

// test1
Перед рендерингом треугольников я включаю тест глубины, затем рисую меньший треугольник и, наконец, рисую больший треугольник. Полученный результат - то, чего я ожидал.

// test2
Перед рендерингом треугольников я отключаю тест глубины, но включаю обновление буфера глубины (glDepthMask(GL_TRUE)). Затем я сначала рисую меньший треугольник, затем включаю тест глубины и устанавливаю функцию сравнения глубины на GL_LESS, наконец нарисую больший треугольник.

Я ожидал, что внутри синего большего треугольника будет красный меньший треугольник. Тем не менее, результат рендеринга - просто синий большой треугольник.

Я установил glDepthMask(GL_TRUE), чтобы значение буфера глубины обновлялось до значения глубины меньшего треугольника. Затем, используя большее значение глубины треугольника по сравнению со значением буфера глубины. Таким образом, я думал, что вижу красный меньший треугольник внутри синего большего треугольника.

// render
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(shaderProgram);

glDisable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

// draw our first triangle with negative depth value
glBindVertexArray(smallTriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, 3);

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

// draw the other triangle with positive depth value
glBindVertexArray(bigTriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, 3);

Что-то не так с моими кодами?

1 Ответ

1 голос
/ 08 апреля 2019

Когда проверка глубины отключена, буфер глубины не записывается вообще.
Если вы хотите записать буфер глубины и каждый фрагмент должен пройти тест глубины, то вам нужно включить тест глубины, но вы должны изменить функцию глубины на GL_ALWAYS, по умолчанию функция глубины равна GL_LESS.
Нет необходимости менять маску глубины, потому что маска глубины по умолчанию включена. См. glDepthFunc, glDepthMask и Проверка глубины

glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE); // superfluous
glDepthFunc(GL_ALWAYS);

// [...]

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
...