Directx 给定世界空间中的法线贴图,找到边的合适算法是什么?
如果我让一个普通场景的顶点法线在世界空间的纹理中显示为颜色,有没有一种方法可以有效地计算边,或者从数学上说是不可能的?我知道,如果在视图空间中有法线,则可以计算边,但如果在世界空间中有法线,则我不确定是否可以计算边(在过去的一个小时里,我一直在尝试找出一种方法…)Directx 给定世界空间中的法线贴图,找到边的合适算法是什么?,directx,hlsl,edge-detection,Directx,Hlsl,Edge Detection,如果我让一个普通场景的顶点法线在世界空间的纹理中显示为颜色,有没有一种方法可以有效地计算边,或者从数学上说是不可能的?我知道,如果在视图空间中有法线,则可以计算边,但如果在世界空间中有法线,则我不确定是否可以计算边(在过去的一个小时里,我一直在尝试找出一种方法…) 我正在将DirectX与HLSL一起使用。这将取决于图像包含的颜色以及它们的合并方式:锐利边缘、抖动、混合, 既然你说你有顶点法线,我假设你可以在一个平面上访问颜色信息。 我使用了两种技术,取得了不同的成功: 我在图像中搜索相同颜色(
我正在将DirectX与HLSL一起使用。这将取决于图像包含的颜色以及它们的合并方式:锐利边缘、抖动、混合,
既然你说你有顶点法线,我假设你可以在一个平面上访问颜色信息。
我使用了两种技术,取得了不同的成功:
然后,构建向量将取决于您希望“线框”图像的粒度有多细。这将取决于图像包含多少颜色,以及它们如何合并:锐利边缘、抖动、混合,…
if ( normalA dot normalB > cos( maxAngleDiff )
既然你说你有顶点法线,我假设你可以在一个平面上访问颜色信息。我使用了两种技术,取得了不同的成功:
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信息,并对颜色曲面的差异进行后期处理