在隐藏网格的位置/位置如何隐藏后处理的网格轮廓


10

我正在3D引擎中设置活动轮廓,为选定的3d角色或屏幕上的风景设置高光效果。在使用模板缓冲区并获得一些不满意的结果(形状问题为凹形,由于距相机的距离导致轮廓线厚度以及台式机和笔记本电脑之间的不一致)后,我切换到边缘检测和帧缓冲区采样并得到了轮廓很满意。

但是,当选定的网格位于另一个网格之后时,我无法隐藏轮廓。考虑到我的过程,这很有意义,因为在渲染场景的其余部分之后,我只是从帧缓冲区中渲染了2d着色器轮廓。

下面是我的结果的两个屏幕截图。第一个是“好”轮廓,第二个是在阻挡轮廓源的网格上看到轮廓的位置。

在此处输入图片说明

渲染过程如下所示:1)仅绘制突出显示的网格的alpha,在帧缓冲区(framebuffer1)中捕获黑色轮廓。

2)将纹理从framebuffer1传递到执行边缘检测的第二个着色器。在framebuffer2中捕获边缘。

3)渲染整个场景。

4)在场景顶部从framebuffer2渲染纹理。

我对如何完成工作有一些想法,希望能收到关于其有效性或更简单或更佳方法的反馈。

首先,我考虑过将整个场景渲染到帧缓冲区,并将突出显示的网格的可见轮廓存储在alpha通道中(所有白色保存,突出显示的网格可见)。然后,我将在alpha通道上执行边缘检测,渲染场景帧缓冲区,然后在顶部渲染边缘。结果是这样的:

结果

为此,我想到了仅在突出显示对象的渲染过程中设置一个定义,该定义将为所有可见像素在alpha中绘制所有黑色。

我的第二个想法是使用上面概述的当前渲染过程,而且在渲染选定网格的轮廓时,还将X,Y和Z坐标存储在framebuffer1的R,G和B通道中。边缘检测将被执行并存储在framebuffer2中,但是我会将RGB / XYZ值从alpha的边缘传递到轮廓。然后,在渲染场景时,我将测试坐标是否在framebuffer2中存储的边缘内。如果是这样,我将测试当前片段的深度,以确定它是在从RGB通道提取的坐标之前还是之后(转换为相机空间)。如果片段在深度坐标之前,则片段将正常渲染。如果片段在后面,则将其呈现为纯轮廓颜色。

我正在为该项目使用LibGDX,并且希望支持WebGL和OpenGL ES,因此我没有涉及几何着色器或更新的GLSL函数的解决方案。如果有人可以评论我提出的方法或提出更好的建议,我将非常感激。


看了你的仓库。您是否找到可接受的解决方法?
iKlsR

Answers:


0

我会将整个场景渲染到带有所需轮廓对象的模具缓冲区中,以设置一个位,并丢弃或移除该位。

然后摆脱边缘检测,您不需要这样做,而是可以将缓冲区稍微扩大一点。因此,每个对象只是略微增长。

从那里,您可以在模板缓冲区中找到所需的轮廓。这是关于确保要渲染的其他对象正在关闭模板缓冲区中的位。


2
谢谢回复。如果缩放是在3d中完成的,这种方法是否会遇到类似的问题,包括轮廓厚度和凹形?还是位移问题(如果它是在2d中完成的,并且轮廓对象不在屏幕的死点中)?
2015年

0

1)在帧缓冲区对象中,可以在GPU中运行拉普拉斯着色器以获取轮廓。

2)在FBO中绘制对象时,必须使用最终的深度缓冲区,这样一来,您将仅在FBO中绘制对象的可见部分,而拉普拉斯人将仅绘制可见部分的轮廓。


嗨,谢谢回复。我已经在这样做以实现我的大纲。我认为您不应该因为这个答案而投反对票,所以请投赞成票。
nils

0

我希望我能弄清楚这一点,但是基本上,您需要对两个对象都作一个模版,就好像它们都被选中一样,然后仅将这些区域保留在您实际要突出显示的项目的边界框中。

因此,基本上,您可以为两个选定的对象(或所有遮挡对象的对象)做一个模版缓冲,真的……但是我不会担心那些情况,除非它真的出现了很多-如果那是被遮挡的人们不会期望的很大的帮助),然后为您的对象加上边框框模板。

那应该会得到您想要的效果。

另外,您也可以留下“不好”的结果,我认为大多数人都不会太在意,尽管这取决于您的数据/游戏,尤其是对象的大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.