我想知道像素/片段的原始模板值.零还是一个?如果可能的话,以获取哪些特定操作会修改模板值

I want to know the original stencil value of a pixel/fragment., zero or one? If possible to get what specific action modify the stencil value?

本文关键字:获取 操作 如果 修改 原始 片段 想知道 像素 一个      更新时间:2023-10-16

我对OpenGL中的模板缓冲区感到困惑。我在这里阅读了OpenGL教程,https://learnopengl.com/advanced-opengl/stencil-testing。我只是添加一个行代码

glStencilFunc(GL_EQUAL, 1, 0xFF);

,然后什么都不会渲染。如果我将行代码设置为

glStencilFunc(GL_NOTEQUAL, 1, 0xFF);

我的obj将正确渲染。

我想知道为什么?原始模板值不是一个吗?下面的一些代码:

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);
}

[...]原始模板值不是一个吗?

默认情况下,模板缓冲区的清晰值为0。

调用glClear(GL_STENCIL_BUFFER_BIT)时清除模板缓冲区。glClearStencil可以指定模板缓冲区的清晰值。初始值为0。