0

如果我将正常场景的顶点法线显示为世界空间中纹理中的颜色,是否有一种方法可以有效地计算边缘,或者在数学上是不可能的?我知道如果您在视图空间中有法线,则可以计算边缘,但我不确定如果您在世界空间中有法线,是否可以这样做(我一直试图找出过去的方法小时..)

我将 DirectX 与 HLSL 一起使用。

4

3 回答 3

2
if ( normalA dot normalB > cos( maxAngleDiff ) 

那么你就有优势了。它不会是完美的,但它肯定会找到其他方法无法找到的边缘。

还是我误解了这个问题?

编辑:简单地说,高通过滤图像怎么样?

于 2009-09-23T22:47:14.810 回答
1

我假设您正在尝试为单元格着色器制作卡通风格的边缘?

如果是这样,只需将世界空间法线与世界空间像素位置减去相机位置进行点积即可。只要您的操作数都在同一个空间中,您就可以了。

float edgy = dot(world_space_normal, pixel_world_pos - camera_world_pos);

如果edgy接近 0,则为边缘。

如果你想要一个屏幕空间大小的边缘,你需要在另一个表面上渲染额外的对象 id 信息,并将差异后处理到颜色表面。

于 2009-10-04T02:49:29.073 回答
1

这将取决于您的图像包含多少颜色,以及它们如何合并:锐边、抖动、混合......
既然你说你有顶点法线,我假设你可以在单个平面上访问颜色信息。
我使用了两种不同的成功技术:

  1. 我在图像中搜索相同颜色 (RGB) 的局部区域,然后使用 R、G 或 B 中的最高值来找到“边缘”——即所选 R、G 或 B 不再是最高值的位置;
  2. 我使用的第二种方法是在内部将图像减少到 16 种颜色,在这种情况下很容易找到轮廓。

然后,构建向量将取决于您希望“线框”图像的粒度有多精细。

于 2009-09-23T16:55:40.050 回答