Я хочу знать исходное значение трафарета пикселя/фрагмента, ноль или единицу? Если возможно получить какое конкретное действие изменить значение трафарета?

Меня многое смущает в буфере трафарета в OpenGL. Я читал туториалы по opengl, https://learnopengl.com/Advanced-OpenGL/Stencil-testing . Я просто добавляю код одной строки

glStencilFunc(GL_EQUAL, 1, 0xFF);

и тогда ничего не будет отображаться. если я установлю код строки как

glStencilFunc(GL_NOTEQUAL, 1, 0xFF);

мои объекты будут отображаться правильно.

Интересно, почему? Дело в том, что исходное значение трафарета равно нулю, а не единице? Некоторый код ниже:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, 1, 0xFF);
//glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
//glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
while (!glfwWindowShouldClose(window))
{
    glfwPollEvents();
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    shader.use();
    glm::mat4 model = glm::mat4(1.0f);
    glm::mat4 view = g_camera.GetViewMatrix();
    glm::mat4 projection = glm::perspective(g_camera.Zoom, (float)AppGlobal::getInstance()->windowWidth / (float)AppGlobal::getInstance()->windowHeight, 0.1f, 100.0f);
    glUniformMatrix4fv(glGetUniformLocation(shader.m_program, "view"), 1, GL_FALSE, glm::value_ptr(view));
    glUniformMatrix4fv(glGetUniformLocation(shader.m_program, "projection"), 1, GL_FALSE, glm::value_ptr(projection));

    // Floor
    glBindVertexArray(planeVAO);
    glBindTexture(GL_TEXTURE_2D, floorTexture);
    model = glm::mat4(1.0f);
    glUniformMatrix4fv(glGetUniformLocation(shader.m_program, "model"), 1, GL_FALSE, glm::value_ptr(model));
    glDrawArrays(GL_TRIANGLES, 0, 6);
    // some other objects
    glBindVertexArray(0);
    glfwSwapBuffers(window);
}

person Mengyu Chen    schedule 30.07.2019    source источник


Ответы (1)


[...] Это исходное значение трафарета равно нулю, а не единице?

По умолчанию значение очистки для буфера трафарета равно 0.

Буфер трафарета очищается при вызове glClear(GL_STENCIL_BUFFER_BIT). Значение очистки для буфера трафарета можно указать с помощью glClearStencil. Начальное значение равно 0.

person Rabbid76    schedule 30.07.2019