2012-10-16 78 views
16

在OpenGL中,我可以通过正常绘制对象来绘制轮廓对象,然后再以线框的形式绘制轮廓,使用模板缓冲区,以便不会绘制原始对象。但是,这会导致一个纯色的轮廓。OpenGL中的轮廓效果

enter image description here

在此图像中,生物的轮廓的像素似乎得到更透明的进一步他们是从他们勾勒出的生物。我怎样才能获得与OpenGL相似的效果?

回答

6

他们没有为此使用线框。我想这在很大程度上着色器相关,需要这样的:

  1. 渲染对象到模板缓存
  2. 渲染模板缓存与选择的颜色,而在它上面的应用模糊
  3. 渲染模型
+0

因此,我们用纯色绘制对象到纹理,然后使用模糊着色器在屏幕上绘制纹理? – dupersuper

+0

是的,但它可能不是唯一的方法。 – weltensturm

+1

这实际上是如何在我的工作标题上完成的,虽然它对我们来说有问题。在采用这种方法之前,请考虑屏幕的大小将包含您的轮廓 - 有更便宜的效果可用于传达“此模型突出显示”。在现代游戏中,你可能没有足够的空闲空间。 – Philip

1

据我所知,屏幕上的效果很短,许多“边缘”效果也不是纯边缘,如漫画般的轮廓。大部分工作都做完了,你只需要一遍就可以正常渲染对象,然后只传递几何图形(无纹理)和GLSL着色器。在片段着色器中采用法线,法线垂直于为对象着色的相机向量。然后通过将区域包括在接近完美垂线的位置来平滑效果。

我将不得不查找确切的数学,但我认为如果你拿相机矢量的点积和正常你得到的“垂直度”的数量。然后你可以通过像EXP函数运行得到一个偏向1.

所以(不保证它是正确的):

exp(dot(vec3(0, 0, 1), normal)); 

(注:一切都在屏幕空间)

4

我迟到了,但我试图达到同样的目的,并认为我会分享我使用的解决方案。

使用不太复杂的着色器,可以在单次绘制操作中实现类似的效果。

在片段着色器中,您将根据闪电和纹理计算片段的颜色,为您提供未加亮的颜色“colorA”。

您的第二个颜色是轮廓颜色'colorB'。

你应该得到相机矢量片段,归一化它,然后得到这个矢量的点积和片段的正常。

相机矢量的片段只是片段在眼睛空间中的位置的倒数。

片段的颜色则是:

float CameraFacingPercentage = dot(v_fragmentToCamera, v_Normal); 
gl_FragColor = ColorA * CameraFacingPercentage + ColorB * (1 - FacingCameraPercentage); 

这是基本的想法,但你要玩有更多或更少的轮廓颜色。此外,模型的凹陷部分也将突出显示,但问题中发布的图像中也是如此。