给定世界空间中的法线贴图,找到边缘的合适算法是什么?

问题描述 投票:0回答:3

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

我正在使用DirectX和HLSL。

directx hlsl edge-detection
3个回答
1
投票

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

如果是这样,只需将世界空间法线的点积与世界空间像素位置减去相机位置即可。只要你的操作数都在同一个空间你应该没问题。

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

如果edgy接近0,那就是优势。

如果需要屏幕空间大小的边缘,则需要在另一个表面上渲染其他对象ID信息,然后将差异后处理到颜色表面。


2
投票
if ( normalA dot normalB > cos( maxAngleDiff ) 

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

或者我误解了这个问题?

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


1
投票

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

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

那么构造矢量将取决于你想要“线框”图像的粒度有多精细。

© www.soinside.com 2019 - 2024. All rights reserved.