被遗忘的Shader程序纹理-延边内缩纹理

最近感悟:

相信很学Shader的小伙伴都是从冯乐乐的入门精要开始的。我也一样,在讲的程序纹理的时候篇幅也是非常短。
举了一个例子:即在一个面上画上了9个点。当时我的想法是在图上画点这个能起什么作用呢?
于是很快就看完跳过了,至到最近又重读这本书,仿佛打开了新世界的“狗洞”。
哈哈哈…如果没留意真的就忽略过去了,程序纹理能做的事情真的太多了…

正文:

最近接到一个需求最终效果如图:
在这里插入图片描述
贴图是这样子的
在这里插入图片描述

即沿着模型边缘向内画一圈,咱先不管这效果有啥用处哈。
确实翻便了很多网站都没能查到什么有用的资料,也试了很多点的方法。
比如:
我自己想的是,用3个Pass通关,每个比上一个向上一点,顶点向中心点缩一点来达到这种效果。
用性能小号非常大不说,如果在上面叠加别的效果也是非常麻烦,不可操作。
效果大概是这样的:
在这里插入图片描述
以下是使用程序纹理的实现的大致流程:
一、首先是找到切面中的所有顶点。
二、记录所有顶点所对应的UV顶点。
三、利用所有UV顶点的平均值算出大概的UV中心点。
四、每个UV顶点连接中心点可以得到一个夹角。
五、能过第四步的夹角对顶点进行排序。
六、利用程序纹理画线,按顺序连接所有点。
七、头尾相连封口。

疑问点:
一、顶点对应UV是怎么确定的。
答:一种方式的自家的模型,UVW展开的时候可以进行编辑。
在这里使用的是(EzySlice)工具进行对切得到的,只能用来地切简单模型,切后会直接生成一个面直接使用一个独立的材质,我们就可以在这上面做文章了。

二、如何对纹理进行画线。
答:这部分也是核心,把代码分享给大家:
1、OperateTexture参数是(排好序的顶点,原本材质贴图)。
2、将方法返回的图片重新赋值给材质即可。

//画线部分
    //**************************************************************************************
    private float lineNum = 1000f;
    private int lineWidth = 10;//设置笔宽
    private Color lineColor = new Color(1,0.658f, 0.525f);// Color.red;

    private Texture2D OperateTexture(List<Vector2> listPoint, Texture2D targetTex)//, TextureLineType lineType
    {
    
    
        Texture2D curTex2D = new Texture2D(targetTex.width, targetTex.height);
        curTex2D.SetPixels(targetTex.GetPixels());

        for (int i = 0; i < listPoint.Count - 1; i++)
        {
    
    
            draw(curTex2D, listPoint[i], listPoint[i + 1]);
        }
        draw(curTex2D, listPoint[listPoint.Count-1], listPoint[0]);

        curTex2D.Apply();
        return curTex2D;
    }

    private void draw(Texture2D tex, Vector2 start, Vector2 end)
    {
    
    
        for (int j = 0; j < lineNum; j++)
        {
    
    
            float scaleX = Mathf.Lerp(start.x, end.x, j / lineNum);
            float scaleY = Mathf.Lerp(start.y, end.y, j / lineNum);
            int textureX = (int)(scaleX * tex.width);
            int textureY = (int)(scaleY * tex.height);
            // 线条加粗
            for (int a = textureX - lineWidth; a < textureX + lineWidth; a++)
            {
    
    
                for (int b = textureY - lineWidth; b < textureY + lineWidth; b++)
                {
    
    
                    tex.SetPixel(a, b, lineColor);
                }
            }
        }
    }
    //**************************************************************************************

以上是我暂时能想到的觉得的有分享意义的问题,如果还有请留言或私信我,我会再添加上去,谢谢大家。

题外话:
其实这个只是我需求的一部分,需求本身是平切模型后,在切面上延边画一个画圈。

使用精确切割的工具是:Shatter Toolkit
这个切出来精确的模型,但未能把切面分割到另一个材质中。

使用非精确的工具是:EzySlice
这个只能切割一些简单的模型,也会把切面挑出来到另一材质中计算。

但是苦于无法将其切的很好实现效果。使用切的很精确的工具也只能直接使用平铺的贴图,所以最近头疼的很。
估计下一步需要试一下使用精确切割的工具,然后再将切面上的点挑出来一另一个材质上UV计算。

在这个过程中零零碎碎的也试了很多方法了,始终没有办法实现,当然后面如果实现也会把方法分享给大家。
如果大家有更好的方式,也请给我提个醒,非常感谢。

猜你喜欢

转载自blog.csdn.net/ww1351646544/article/details/107139303