7

我已经使用 glsl 成功实现了一个 cel 着色器。但是我的问题是关于概述所有内容,互联网上的每个 opengl 示例都非常陈旧,与当前技术不匹配,因此技术很慢等等......所以我无论如何都找不到在 glsl 中做这件事。我想过一些想法,比如将最不密集的区域着色为黑色,但关于 gl_Vertex、gl_Position 和眼睛位置的解释甚至不够。所以,由于每一项技术都太老了,我终于决定向某人询问这个大纲问题。

4

2 回答 2

9

我会在 zbuffer 上使用某种边缘检测过滤器(可能与颜色缓冲区上的边缘检测结合使用),然后用(反转的)结果调制帧缓冲区。最常见的边缘检测过滤器之一是 sobel 算子:

http://en.wikipedia.org/wiki/Sobel_operator

编辑:另一种便宜的方法是在渲染普通网格之前绘制一个黑色的网格副本,剔除面向倒置,顶点在法线方向略微移动。这可能是他们在 XIII 中所做的,我也很确定这就是在 Jet Set Radio 中所做的。

EDIT2:如果您希望轮廓的厚度保持不变,而不管与观察者的距离如何,您应该使用这个距离缩放顶点的移动量。

于 2012-06-25T11:24:15.113 回答
1

你看过 glPolygonOffset 吗?

我用它在填充的多边形上绘制轮廓。

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPolygonOffset.xml

于 2012-06-26T08:24:28.730 回答