我目前正在尝试在我的项目中实现一个轮廓算法(使用Open GLES,它适用于移动设备,目前主要是iPhone)。其中一个要求是绘制一组3D线。默认OpenGL线的问题在于,当它们很粗(出现间隙)时,它们不能很好地连接。其他微妙的文物也很明显,这有损于线条的视觉吸引力。
现在,我已经研究过使用某种四边形条作为替代方案。但是,在屏幕空间中绘制四边形条带需要某种可见性检测 - 实际3D世界中模糊的线条不应该是可见的。
这个问题有很多方法 - 即定量不可见性。但是,考虑到需要采用光线投射,这种方法,特别是在具有有限处理能力的移动设备上,难以有效地实现。再看一些我发现this paper,它描述了使用z缓冲区采样来实现这种效果的几种方法。但是,我不是这方面的专家,虽然我在一定程度上理解了技术背后的理论,但我不确定如何进行实际实施。我想知道是否有人可以在技术层面上指导我 - 在OpenGLES方面。我也对任何有关3D线路可见度的建议持开放态度。
答案 0 :(得分:0)
使用z-buffer的技术对于iOS设备来说太复杂了 - 它需要重像素着色器和(恕我直言)它会带来一些视觉瑕疵。
如果您的模型不复杂,您可以在运行时找到几何轮廓 - 例如通过比较多边形的法线与公共边缘:如果视图空间中的z值具有不同的唱歌(一个法线指向相机,另一个法线指向相机相机)然后这个边缘应该用于剪影。
另一种方法是“FPS友好”:保持模型的挤压版本。并首先渲染具有轮廓颜色(没有纹理和光照)和正常模型的挤压模型。你需要更多的顶点内存,但不需要实时计算。
PS:在我看过的所有游戏中,轮廓都是几何的。答案 1 :(得分:0)
我已经找到了一个在iPhone 4S上运行良好的解决方案(未在任何其他设备上测试过)。它建立在渲染世界空间四边形的基础上,并在GPU上进行轮廓检测。它按照这些方式工作(双关语并非意图):
这并不能直接解决相邻边缘之间可能出现的间隙,但在解决这个问题时要灵活得多。一种解决方案可能涉及将大角度线与另一个四边形之间的顶点桥接,我现在正在探索。