标准:我正在使用带有着色器 (GLSL) 的 OpenGL,并尝试使用现代技术(例如,尝试远离已弃用的概念)。
我的问题,在一个非常笼统的意义上——更多细节见下文——如下:
- 着色器是否允许您进行自定义混合以帮助消除使用 GL_BLEND 时发现的 z 顺序透明度问题?
- 有没有办法让着色器知道正在绘制什么类型的图元而无需“手动”传递某种标志?
- 着色器有没有办法“忽略”或“丢弃”顶点(尤其是在绘制点时)?
背景:我的应用程序在正交投影中绘制与线相连的点(顶点在投影中具有不同的深度)。我最近才开始在项目中使用着色器(试图摆脱已弃用的概念)。我了解标准混合在 alpha 测试和深度测试方面存在排序问题:基本上,如果首先绘制较高 z 级别的“半透明”像素(因此与已在较低 z 级别的该像素绘制的任何颜色混合),然后在该像素处绘制一个不透明对象,但在较低的 z 级别上,深度测试可防止更改已经为“较高”z 级别绘制的像素,从而导致混合问题。为了克服这个问题,您需要先绘制不透明的项目,然后按 z 升序绘制半透明的项目。
此外,为了速度和方便,我将每个顶点的信息(以及几个统一变量)传递给着色器,它们使用这些信息来查找需要特别注意的顶点子集。如果不在应用程序本身中执行一组类似的逻辑(并减慢速度),我无法先验地知道那是什么验证子集。因此,我将所有顶点发送到着色器。但是,当我绘制“点”时,我希望着色器忽略所有不在它确定的子集中的顶点。我想我可以通过将 alpha 设置为零并在 GL 上下文中使用 alpha 函数来获得效果,这将防止绘制任何 alpha 小于 0.01 的东西。然而,有没有更好或更“正确”的 glsl 方式让着色器说“忽略这个顶点”?