1

所有几何图形都存储在一个 VBO 中(透明 + 不透明)。我无法对几何进行排序。如何在不丢失数据颜色的情况下禁用从 glsl 写入深度缓冲区?

4

2 回答 2

5

如果我理解正确,您想禁用深度写入,因为您同时绘制了不透明和透明的对象。除了它在 GLSL 中不能以这种方式工作之外,它不会产生你想要的东西,如果它这样做的话。

如果您只是禁用了 depth writes ad hoc,那么在透明对象之后的不透明对象将覆盖它,而不管 z 顺序如何。

你真正想做的是:

  1. 启用深度写入和深度测试
  2. 绘制所有不透明的几何体。如果可以的话,按照大致排序(大致足够好!)的顺序,首先是最近的对象。
  3. 禁用深度写入,保持启用深度测试
  4. 启用混合
  5. 绘制透明对象,按相反方向排序,即最远的先。这会遮挡具有不透明几何形状的透明对象,并使混合正常工作。

如果由于某种原因,您无法对不透明的几何图形进行排序(尽管确实没有理由不能这样做?),没关系 - 它会稍微慢一些,因为它不会剔除碎片,但它会产生相同的图像。

如果由于某种原因,您无法对透明几何图形进行排序,那么您将不得不预期在多个透明对象重叠的情况下会出现不正确的结果。这可能很明显,也可能不明显(特别是如果顺序是“随机的”,即逐帧更改,这将非常明显——否则你实际上可能会侥幸逃脱,尽管它是不正确的)。

请注意,正如 datenwolf 已经指出的那样,多个对象位于一个 VBO 中的事实并不意味着您不能绘制它们的子集,或者以您想要的任何顺序绘制多个子集。毕竟,一个 VBO 只包含一些顶点,这取决于你按什么顺序绘制其中的哪些组。

于 2012-01-12T11:14:15.573 回答
0

你不能。

我无法对几何进行排序。

为什么?你认为是因为这一切都在一个 VBO 中吗?然后我得到了好消息:完全可以仅从缓冲区对象的子集进行绘制。

于 2012-01-12T10:01:03.603 回答