Opengl GLSL顶点着色器取消渲染

Opengl GLSL顶点着色器取消渲染,opengl,glsl,terminate,vertex-shader,Opengl,Glsl,Terminate,Vertex Shader,可以在顶点着色器中终止像素的渲染。例如,如果某个顶点不满足特定要求,请取消该顶点的渲染?您不能在顶点着色器中终止像素的渲染(它不处理像素),但可以在片段着色器中使用放弃指令。我假设您说“将终止对顶点的渲染”“不,你不能;OpenGL对VS的输入顶点与输出顶点的1:1比率要求非常严格。而且,它也不是你想要的,因为顶点不会被渲染。基本体可以,并且一个基本体可以由多个顶点组成。例如,在三角形条带中间丢弃一个顶点意味着什么?例如: 这就是为什么我们有能力“挑选”原语;它们专门处理一个基本体,而不仅仅是一

可以在顶点着色器中终止像素的渲染。例如,如果某个顶点不满足特定要求,请取消该顶点的渲染?

您不能在顶点着色器中终止像素的渲染(它不处理像素),但可以在片段着色器中使用放弃指令。

我假设您说“将终止对顶点的渲染”“不,你不能;OpenGL对VS的输入顶点与输出顶点的1:1比率要求非常严格。而且,它也不是你想要的,因为顶点不会被渲染。基本体可以,并且一个基本体可以由多个顶点组成。例如,在三角形条带中间丢弃一个顶点意味着什么?例如:

这就是为什么我们有能力“挑选”原语;它们专门处理一个基本体,而不仅仅是一个顶点。这是通过不发射任何顶点来实现的;GS必须显式发射它想要输出的顶点



顶点着色器现在能够剔除基本体。这是通过使用。这就像
gl_ClipDistance
,只是如果其中一个顶点超过阈值,它会剔除整个基本体,而不是进行剪裁。

理论上,可以使用顶点着色器生成退化(零区域)基本体。面积为零的基本体不应导致任何光栅化,因此不会渲染任何片段。但是,这并不是特别直观,尤其是在使用共享顶点的基本体时

但是,取消顶点几乎没有意义。它是构造原语的基本单元。如果只删除单个顶点,则将以未定义的方式更改光栅化输出

简单地说,顶点不是在屏幕上创建像素的东西。正是顶点之间的连通性创建了基本体,最终导致像素。几何体着色器在一个基元一个基元的基础上进行操作,因此它们通常是以编程方式取消栅格化和片段着色的地方


更新:

我注意到您正在使用
GL_POINTS
作为基本类型。在这种特殊情况下,要防止顶点沿着管道向下移动,只需将其位置设置在摄影机观察体积之外的某个位置。顶点将被剪裁,不会发生光栅化或碎片着色

这是一个更有效的解决方案,用于测试片段着色器中的某些条件,然后丢弃,因为您跳过了光栅化,并且根本不必执行片段着色器。更不用说,
discard
通常作为一个后期着色器执行标志,告诉GPU放弃结果-GPU通常被强制执行整个着色器,无论您在着色器中的何处发出
discard
指令。因此,
discard
很少提供性能优势,在许多情况下,它可以禁用其他可能更有用的硬件优化。不幸的是,这就是GPU安排着色器工作负载的方式


最便宜的片段是你永远不需要处理的片段:)

我正在详细阐述Andon M.Coleman的答案,这值得我指出是正确的答案

尽管OpenGL规范坚持不能跳过片段着色器步骤(除非如Nicol Bolas正确指出的那样,实际上删除了几何体着色器中的整个基本体,这有点过分了),但实际上可以让OpenGL剔除整个几何体,因为现代GPU有早期的片段拒绝优化,这可能会产生相同的效果

而且,对于记录来说,丢弃整个几何体非常简单:只需将顶点写在(-1,-1,-1),(1,1,1)立方体之外

…然后你走


希望这对您有所帮助

您可以对顶点流进行更改,包括删除顶点,但需要在几何体着色器中进行更改。如果查看几何体着色器,您可能会在无法“发射”顶点中找到所需的解决方案

编辑:如果渲染三角形条带,在删除顶点时,可能还需要小心启动新的基本体;如果你调查geom,你就会明白为什么了。着色器。有了GL_积分,问题就不那么严重了

是的,例如,如果你发送一个只有两个顶点的三角形条带,那么你确实无法渲染任何东西——就像你在一开始通过这样一个退化条带时所做的那样。然而,这并不意味着顶点流不能在GL方面进行更改

希望这对汤姆有帮助

  • 将位置设置到ndc之外

  • 设置标志并传递给fragment,并根据标志在fragment中丢弃


  • 如果您正在渲染三角形,并且决定不渲染一个顶点,那么应该是什么样子?我认为你的问题已经暗示了一个几何问题——但你可以将顶点移动到同一多边形中另一个(下一个或上一个)顶点的位置,或多或少地消除它(你仍然可以在最终图像中看到纹理/着色等的效果),实际上只会丢弃像素的结果。在现代硬件(Shader Model 3.0+)上,像素以2x2块绘制,以使派生指令工作。。。这些2x2块可以调度为同时运行的着色器的扭曲(NV)或波前(AMD)。早期脱离碎片着色的唯一方法是丢弃扭曲/波前中的每个碎片。否则,它将继续计算所有指令,但最终将逐像素地抛出结果。通常情况下,
    discard
    kill
    实际上并不终止任何内容,它只是看起来很简单
    gl_Position = vec4(2.0, 2.0, 2.0, 1.0);