美文网首页
Normal based Edge Dtect

Normal based Edge Dtect

作者: ShiweyYan | 来源:发表于2015-05-19 23:32 被阅读0次

边缘检测有很多方法,这里讲的是基于法线的边缘检测。

需要的知识有RTT(Render to target),嗯,没错就这么简单,你只要会RTT,两分钟就搞定这个算法。

这个算法的核心思想就是利用物体的边缘法线会发生变化,而法线变化越大,两个法线点积的值就越小。
那么如何获取法线呢,这里就涉及到了RTT,你要将需要检测的物体先渲染一遍,将法线信息保存到一张纹理中,然后通过采样对比每一点的法线和它周围的法线,从而得到结果。

具体步骤

1.RTT,将法线保存到一张纹理中。

2.使用一中的纹理,采用获得其中的法线数据,并将每一点的法线和它周围像素的法线点积,这样就可以得到一张描边的纹理了。

3.根据需求使用上边那张纹理。

具体实现:

步骤1的实现:

VertexOut VS(VertexIn vin)
{
    VertexOut vout;

    // 转换到投影空间
    vout.PosH = mul(float4(vin.PosL, 1.0f), World);
    vout.PosH = mul(vout.PosH, View);
    vout.PosH = mul(vout.PosV, Proj);

    vout.NormalV = mul(float4(vin.Normal,0.0f), WorldInvTransView).xyz;

    return vout;
}

float4 PS(VertexOut pin) : SV_Target
{
    pin.NormalV = normalize(pin.NormalV);

    float4 normal = float4(pin.NormalV,0.0f);

    return normal;
}

步骤2的实现:

vs就不写了,看你具体干什么了直接说ps:

float4 PS_EdgeDetect(VertexOut pin) : SV_Target
{
    float3 normal = normalDepthTex.Sample(samNormalDepth, pin.Tex).xyz;
    float sum = 0;
    if (normal.x!=0.f&&normal.y!=0.f&&normal.z!=0.f)
    {
        for (int i = 0; i < 4; ++i)
        {
            sum += saturate(1 - dot(normal, normalDepthTex.Sample(samNormalDepth, pin.Tex + PixelKernel[i]).xyz));
        }
    }
    
    return float4(sum, sum, sum, 0.0f);
}

大致就是这样,具体的需要根据具体需求去更改。

下面按照惯例上图:

edge_detectedge_detect

相关文章

  • Normal based Edge Dtect

    边缘检测有很多方法,这里讲的是基于法线的边缘检测。 需要的知识有RTT(Render to target),嗯,没...

  • edge:H5抓包 (android)

    1、卸载安装edge:并输入地址:edge://inspect/#devices[edge://inspect/#...

  • 无标题文章

    ## The Normal Distribution## The Normal Distribution The ...

  • 试一试

    ## The Normal Distribution The normal distribution is def...

  • Normal

    最新一集奇葩大会听到一句话觉得很矫情 和自己的人生和解 人类在探寻生命真谛的路上从未停下 今晚我觉得 就是承认自己...

  • Normal

    九月的风吹过炽热的夏天 就像嫉妒我们过火的爱情 好比是 再牛的人也要吃饭 再帅的人也要尿尿 一样,再平常不过了

  • Normal

    Afraid of being normal I dressed in clown Now I m famous ...

  • To be normal

    Normal People里最令我动容的是Connell与Marianne的惺惺相惜,与彼此共同成长。 从眼神里,...

  • Normal

    有时候别人对你很糟糕,不代表你就该被糟糕地对待。很多人爱你,关心你,希望你要知道。--《Normal People...

  • Unity Shader优化

    (1) 用step()代替if else等条件语句:(edge=step(edge,_Edge);表示if(edg...

网友评论

      本文标题:Normal based Edge Dtect

      本文链接:https://www.haomeiwen.com/subject/pkplqttx.html