我看到一些进行cel着色的广泛方法:
- 具有翻转法线的模型的复制和放大(对我而言不是一种选择)
- Sobel滤波器/片段着色器进行边缘检测的方法
- 模板缓冲区方法进行边缘检测
- 用于计算面法线和边缘法线的几何(或顶点)着色器方法
我是否假设以几何为中心的方法也可以最大程度地控制照明和线条粗细,这是正确的吗?对于可能会看到山的轮廓线逐渐合并成平原的地形?
如果我不需要地形表面的像素照明怎么办?(而且我可能不会,因为我计划使用基于单元的基于顶点或基于纹理贴图的照明/阴影。)那么我是否会更好地坚持使用几何类型方法,或者改为使用屏幕空间/片段方法?使事情更简单?如果是这样,我怎么会得到山上的“墨” 内网的剪影,而不是只有整个网格(的轮廓与轮廓内没有“墨水”的细节?(AKA 暗示的轮廓,折痕)。
最后,是否可以使用几何着色器廉价地模拟翻转法线方法?我对此的担心是,我当然可以复制每个单个顶点并相应地缩放它们,但是我将如何处理翻转法线和片段着色器中的不同着色?
我想要的-在轮廓内插入线来改变线的粗细...
我不要...
编辑:进一步的研究发现了以下...
由于我在地形上拥有大量顶点,因此即使考虑基于距离的LoD,由于所有对象的复制和缩放都涉及巨大的计算复杂性,因此无论是基于翻转法线还是基于几何着色器的方法(即使使用平截头体剔除)都不是明智的选择。上传的顶点。
考虑到我不需要在地形表面上以纯色阴影的形式进行逐像素照明,因此考虑基于面部法线的方法(否则需要正确的表面照明)也变得不太谨慎计算起来自然很昂贵。但是,他们确实提供了最好的控制权。例如,使用“艺术”笔触为边缘着色的能力:漂亮,但又不能在大规模复杂的游戏环境中真正实现。
我宁愿避免使用模板缓冲区,因为我希望在着色器中完成所有工作。(上面带有红色轮廓的示例是使用模板缓冲区-旧学校完成的。)
这样就留下了片段着色器的图像空间方法。计算复杂度降低为片段的数量,而不是顶点的数量(在我的情况下,这比几何着色器中的操作要少10-100倍)。为了生成一个g缓冲区(包括一个普通缓冲区和一个可选的深度缓冲区),需要多次渲染渲染,我们可以将不连续性滤镜(例如Sobel运算符)应用到该缓冲区。深度不连续性使轮廓和折痕产生暗示。我唯一的疑问是无法对墨迹边缘宽度进行更好的控制,尽管使用片段着色器中的正确算法,我相信这是可能的。
因此,现在的问题变得更加具体:我如何精确地在片段着色器中获得可变的边缘宽度,尤其是在外部轮廓上?