我想知道像素/片段的原始模板值,零还是一?如果可能的话可以得到什么具体的动作来修改模板值?

问题描述 投票:0回答:2

我对 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);
}
c++ opengl glfw glm-math stencil-buffer
2个回答
3
投票

[...] 难道原来的模板值是0而不是1?

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

调用

glClear(GL_STENCIL_BUFFER_BIT)
时,模板缓冲区将被清除。模板缓冲区的清除值可以通过
glClearStencil
指定。初始值为0。


0
投票

不幸的是,无论有意还是无意,它都是 OpenGL 保守得最好的秘密之一。

简短的回答:通过访问https://www.khronos.org/opengl/wiki/Stencil_Test,它说 for function void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask); ref定义了为给定面生成的所有片段的片段模板值。片段模板值将被限制在模板缓冲区的位深度定义的范围内。现在您已经知道了,“ref”变量是在遮罩之前将绘制到模板片段的原始值。

© www.soinside.com 2019 - 2024. All rights reserved.