我想知道像素/片段的原始模板值。零还是一?如果可能的话,得到啥具体的动作来修改模板值?
Posted
技术标签:
【中文标题】我想知道像素/片段的原始模板值。零还是一?如果可能的话,得到啥具体的动作来修改模板值?【英文标题】: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?我想知道像素/片段的原始模板值。零还是一?如果可能的话,得到什么具体的动作来修改模板值? 【发布时间】:2019-07-30 16:17:43 【问题描述】:我对 OpenGL 中的模板缓冲区有很多困惑。我在这里阅读了 opengl 教程,https://learnopengl.com/Advanced-OpenGL/Stencil-testing。我只是添加了一行代码
glStencilFunc(GL_EQUAL, 1, 0xFF);
然后什么都不会被渲染。 如果我将行代码设置为
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
我的 objs 将被正确渲染。
我想知道为什么?是不是原来的模板值是零而不是一? 下面是一些代码:
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);
【问题讨论】:
【参考方案1】:[...] 原来的stencil值是零不是一吗?
默认情况下,模板缓冲区的清除值为 0。
调用glClear(GL_STENCIL_BUFFER_BIT)
时清除模板缓冲区。模板缓冲区的清除值可以由glClearStencil
指定。初始值为0。
【讨论】:
@MengyuChen 不客气。问题解决了吗?请阅读What should I do when someone answers my question?以上是关于我想知道像素/片段的原始模板值。零还是一?如果可能的话,得到啥具体的动作来修改模板值?的主要内容,如果未能解决你的问题,请参考以下文章