如何对顶点(而不是片段)应用深度测试?

时间:2015-03-22 08:46:09

标签: opengl webgl

TL; DR 我在片段着色器中计算深度贴图然后尝试在顶点着色器中使用该贴图来查看顶点是否在视图中#39 ;或不是,顶点不与片段纹素坐标对齐。不精确会导致渲染失真,我正在寻找基于深度过滤顶点的替代方案。

背景即可。我非常松散地尝试实施本文中概述的方案(http://dash.harvard.edu/handle/1/4138746)。这个想法是将任意虚拟对象表示为许多切线光盘。虽然他们想要取代未来某些显卡中的三角形,但我在传统卡上实现了这一点;我的光盘只是中心点周围的三角形("光盘")的粉丝("点")。

这是针对WebGL。

我打算使用的策略,类似于论文中的内容,是:

  1. 以深度传递渲染光盘。
  2. 在第二次(或更多次)传递中,根据哪些点是可见的来计算可见的内容"可见" - 即它们的深度是< =深度的深度 - 仅在x和y处通过。
  3. 我相信本文的作者使用了高斯模糊,相当于应用于点的GL_POINTS渲染(即重新使用DepthOnly传递中的深度缓冲区,而不是清除它)来实际渲染它们的对象。很难说:不幸的是,这个过程是一行评论,我不确定如何在WebGL中复制它(一个天真的高斯模糊只会在背景像素中模糊不清楚。被GL_POINTS调用触及。

    相反,我希望做一些稍微不同的事情,通过在第二遍中重新渲染光盘而不是视锥(圆盘的中心变成圆锥的顶点,想想"关闭伞")和有效地计算对象表面上的voronoi图(ala redbook http://www.glprogramming.com/red/chapter14.html#name19)。该想法是输出像素是当从0-> 0生长半径时到达它的第一盘的颜色值。它们的自然尺寸。

    问题的关键在于,只允许第一次通过中心通过深度测试的光盘继续(作为锥体)到第二次通过。因为光盘中心的真实情况适用于整个光盘/圆锥体,我认为这需要在顶点或物体水平评估深度测试,而不是在片段级别。

    由于WebGL对访问深度缓冲区的支持仍然很差,在我的第一遍中,我将深度信息打包到片段着色器中的RGBA帧缓冲区中。然后,我打算通过sampler2D在第二遍的顶点着色器中使用它;任何比相对texture2D()查找更接近的光盘中心将被允许进入第二遍;否则我会破解"丢弃"顶点(其alpha值将设置为0或某些标志设置会导致丢弃与光盘/圆锥相关的碎片等)。

    这实际上有点起作用,但它在相互靠近的光盘之间引起了可怕的z-fighting(非常小的扰动大大改变了哪些光盘可见)。我相信深度 - > rgba->深度之间存在一些浮点误差。但更重要的是,深度纹理是由片段纹素坐标设置的,但我查找顶点,这几乎肯定不会在相关纹理坐标的顶部排成一行;所以我得到深度+/-噪音,基本上,噪音是问题。添加或减去.000001或其他东西是不够的:您为类型II交易I类错误。当我从NEAREST切换到LINEAR进行深度纹理插值时,我的渲染变得更加准确,但它仍然不够好。

    我如何确定哪个光盘的中心在给定的渲染中是可见的,这样我可以做一个第二个顶点/片段(或更多)传递,专注于与这些点相关联的对象?或者:有没有更好的方法来解决这个问题?

0 个答案:

没有答案