OpenGL Stenciling,将 ref 与写入的值分开?

OpenGL Stenciling, separating ref from value written?

下面的代码设置了模板测试以查看ref是否大于模板缓冲区中存储的值,如果是,它会将ref写入模板缓冲区

unsigned int ref = 42;
glStencilFunc(GL_GREATER, ref, 0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

问题是,虽然我确实想针对 ref 测试模板缓冲区,但我不想 write ref 如果它成功了,我想写一个完全不同的值。我发现的唯一选项是 GL_INCR,它可以代替 GL_REPLACE,但是如果模板缓冲区已经写入了很多无法清除的内容,那么这不是很有用事先.

有没有办法...比如说,测试 42 是否大于模板缓冲区中存储的值,如果是,则向其中写入 100 或其他值?

我认为此功能在标准 OpenGL 中不可用。我找到的最接近的是供应商特定的扩展名:AMD_stencil_operation_extended.

这正是您要找的东西:

Additionally, this extension separates the value used as the source for stencil operations from the reference value, allowing different values to be used in the stencil test, and in the update of the stencil buffer.

仅通过阅读规范,调用应该看起来像这样,val 您要设置的模板值:

glStencilFunc(GL_GREATER, ref, 0xFF);
glStencilOpValueAMD(GL_FRONT_AND_BACK, val);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE_VALUE_AMD);