Opengl 如何在片段着色器中进行自定义模具测试

Opengl 如何在片段着色器中进行自定义模具测试,opengl,fragment-shader,stencil-buffer,Opengl,Fragment Shader,Stencil Buffer,在我的项目中,我使用了“discard”调用来执行定制的模具测试,该测试尝试仅在模具纹理定义的指定区域上绘制对象。以下是片段着色器中的代码: //get the stencil value from a texture float value=texture2D( stencilTexture, gl_FragCoord.xy/1024.0).x; //check if value equals the desired value, if not draw nothing if(abs(valu

在我的项目中,我使用了“discard”调用来执行定制的模具测试,该测试尝试仅在模具纹理定义的指定区域上绘制对象。以下是片段着色器中的代码:

//get the stencil value from a texture
float value=texture2D( stencilTexture, gl_FragCoord.xy/1024.0).x;
//check if value equals the desired value, if not draw nothing
if(abs(value-desiredValue)>0.1)
{
    discard;
}

这段代码可以工作,但由于“discard”调用而存在性能问题。有没有其他方法可以通过GPU着色器实现这一点?告诉我如何操作。

如果访问纹理,必须承受与访问纹理相关的性能损失。同样,如果要停止渲染片段,必须承受与停止渲染片段相关的性能损失

无论您如何停止该片段,这都是正确的。无论是真正的模具测试、基于着色器的
丢弃
还是alpha测试,所有这些都会遇到相同的一般性能问题(对于
丢弃
导致任何重大性能问题的硬件,主要是移动硬件)。唯一的例外是深度测试,这是因为


对于
discard
对性能有重大影响的平台,如果硬件可以假设深度是是否渲染片段的最终仲裁者(因此,深度最高/最低的片段总是获胜),则渲染算法的工作效果最佳。因此,除深度测试之外的任何剔除片段的方法都会干扰此优化。

为什么不能使用默认的模具测试(不在着色器中)?你会得到同样的结果。“头韵”我想你的意思是“另类”。此外,还不清楚为什么需要使用模具纹理来执行此操作。或者为什么你认为
丢弃调用是一个性能问题(或者如果是性能问题,那么这个问题在某种程度上比纹理访问本身更糟糕)。@Nicolas:很抱歉我拼写错误,在我的实验中,我发现丢弃调用是一个性能问题,@fen:也报告了这个问题,谢谢你的回复。我想在着色器中使用模具测试,因为我想在一次渲染过程中在不同的预定义区域上绘制场景。@Sunf71:那么它就不是真正的“模具测试”;它只是根据从纹理访问中获取的值丢弃一个片段。模具制作特别是关于使用一个渲染对象(可见或不可见)写入的值来防止写入这些渲染位置。感谢您的回复!非常合理的回答!