gpt4 book ai didi

opengl - GLSL 着色器 : blending, 图元特定行为,并丢弃顶点

转载 作者:行者123 更新时间:2023-12-04 19:51:39 26 4
gpt4 key购买 nike

标准:我正在使用带有着色器 (GLSL) 的 OpenGL 并尝试使用现代技术(例如,尝试远离已弃用的概念)。

我的问题,在一个非常普遍的意义上——更多细节见下文——如下:

  1. 着色器是否允许您进行自定义混合以帮助消除在使用 GL_BLEND 时发现的 z 顺序透明度问题?
  2. 有没有办法让着色器知道正在绘制什么类型的图元,而无需“手动”传递某种标志?
  3. 有没有办法让着色器“忽略”或“丢弃”顶点(尤其是在绘制点时)?

背景:我的应用程序在正射投影中绘制与线连接的点(顶点在投影中具有不同的深度)。我最近才开始在项目中使用着色器(试图摆脱过时的概念)。我知道标准混合在 alpha 测试和深度测试方面存在顺序问题:基本上,如果首先绘制较高 z 级别的“半透明”像素(因此与较低 z 级别的该像素已经绘制的任何颜色混合),然后在该像素处绘制一个不透明对象,但在较低的 z 级别,深度测试可防止更改已为“较高”z 级别绘制的像素,从而导致混合问题。为了克服这个问题,您需要先绘制不透明项,然后按 z 升序绘制半透明项。我的直觉是着色器不会提供一种(有效的)方式来改变这种行为——我错了吗?

此外,为了速度和方便,我将每个顶点的信息(连同几个统一变量)传递给着色器,着色器使用这些信息找到需要特别注意的顶点子集。如果不在应用程序本身中执行一组类似的逻辑(并减慢速度),我无法先验地知道那是什么验证子集。因此,我将所有顶点发送到着色器。然而,当我绘制“点”时,我希望着色器忽略所有不在它确定的子集中的顶点。我想我可以通过将 alpha 设置为零并在 GL 上下文中使用 alpha 函数来获得效果,这将防止绘制任何 alpha 小于 0.01 的东西。但是,是否有更好或更“正确”的 glsl 方式让着色器说“忽略此顶点”?

最佳答案

Do shaders allow you to do custom blending that help eliminate z-order transparency issues found when using GL_BLEND?

有点。如果您可以使用 GL 4.x 级硬件(Radeon HD 5xxx 或更好,或者 GeForce 4xx 或更好),那么您可以执行与顺序无关的透明度。早期版本有深度剥离等技术,但它们非常昂贵。

GL 4.x 级版本实质上使用了一系列透明样本的“链接列表”,您可以执行全屏传递以解析为最终样本颜色。它当然不是免费,但它不像其他 OIT 方法那么昂贵。不确定您的情况要花多少钱;它与您有多少重叠像素成正比。

你还是得先画不透明的东西,再画透明的东西用特殊的shader代码。

Is there a way for a shader to know what type of primitive is being drawn without “manually” passing it some sort of flag?

没有。

Is there a way for a shader to “ignore” or “discard” a vertex (especially when drawing points)?

一般情况下不会,但积分会。几何着色器可以有条件地发射顶点,因此允许您出于任意原因丢弃任何顶点。

丢弃非点图元中的顶点是可能的,但它也会影响对该图元的解释。点之所以简单是因为顶点一个图元,而三角形中的一个顶点不是一个完整的图元。您可以丢弃线,但丢弃线内的顶点是……具有可疑值(value)。

话虽如此,您对为什么要这样做的解释值得怀疑。你想用一个 bool 值来更新顶点数据,该值表示“与我一起做事”或不这样做。这意味着,在每一帧中,您都必须修改数据以说明哪些点应该被渲染,哪些点不应该被渲染。

做到这一点的最简单和最有效的方法就是不使用它们进行渲染。也就是说,安排您的数据,使 GPU 上唯一的东西就是您想要渲染的点。因此,根本不需要做任何特别的事情。如果您要不断更新顶点数据,那么您已经注定要处理 streaming vertex data .因此,您不妨以提高渲染效率的方式对其进行流式传输。

关于opengl - GLSL 着色器 : blending, 图元特定行为,并丢弃顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11231360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com