我正在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函数的解决方案。如果有人可以评论我提出的方法或提出更好的建议,我将非常感激。