最近感悟:
相信很学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计算。
在这个过程中零零碎碎的也试了很多方法了,始终没有办法实现,当然后面如果实现也会把方法分享给大家。
如果大家有更好的方式,也请给我提个醒,非常感谢。