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

Directx 给定世界空间中的法线贴图,找到边的合适算法是什么?,directx,hlsl,edge-detection,Directx,Hlsl,Edge Detection,如果我让一个普通场景的顶点法线在世界空间的纹理中显示为颜色,有没有一种方法可以有效地计算边,或者从数学上说是不可能的?我知道,如果在视图空间中有法线,则可以计算边,但如果在世界空间中有法线,则我不确定是否可以计算边(在过去的一个小时里,我一直在尝试找出一种方法…) 我正在将DirectX与HLSL一起使用。这将取决于图像包含的颜色以及它们的合并方式:锐利边缘、抖动、混合, 既然你说你有顶点法线,我假设你可以在一个平面上访问颜色信息。 我使用了两种技术,取得了不同的成功: 我在图像中搜索相同颜色(

如果我让一个普通场景的顶点法线在世界空间的纹理中显示为颜色,有没有一种方法可以有效地计算边,或者从数学上说是不可能的?我知道,如果在视图空间中有法线,则可以计算边,但如果在世界空间中有法线,则我不确定是否可以计算边(在过去的一个小时里,我一直在尝试找出一种方法…)


我正在将DirectX与HLSL一起使用。

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

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

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

    这将取决于图像包含多少颜色,以及它们如何合并:锐利边缘、抖动、混合,…
    if ( normalA dot normalB > cos( maxAngleDiff ) 
    
    既然你说你有顶点法线,我假设你可以在一个平面上访问颜色信息。
    我使用了两种技术,取得了不同的成功:

  • 我在图像中搜索相同颜色(RGB)的局部区域,然后使用R、G或B中的最高值来查找“边缘”——即所选R、G或B不再是最高值的地方
  • 我使用的第二种方法是在内部将图像减少到16种颜色,在这种情况下很容易找到轮廓
  • 然后,构建向量将取决于您希望“线框”图像的粒度有多细

    if ( normalA dot normalB > cos( maxAngleDiff ) 
    
    那你就有优势了。它并不完美,但它肯定会找到其他方法无法找到的优势

    还是我误解了这个问题

    编辑:简单地说,对图像进行高通滤波怎么样

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

    还是我误解了这个问题


    编辑:简单地说,对图像进行高通滤波怎么样?

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

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

    float edgy = dot(world_space_normal, pixel_world_pos - camera_world_pos);
    
    如果
    edgy
    接近0,则为边


    如果需要屏幕空间大小的边,则需要在另一个曲面上渲染其他对象id信息,并对颜色曲面的差异进行后期处理。

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

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

    float edgy = dot(world_space_normal, pixel_world_pos - camera_world_pos);
    
    如果
    edgy
    接近0,则为边

    如果需要屏幕空间大小的边,则需要在另一个曲面上渲染其他对象id信息,并对颜色曲面的差异进行后期处理