unity 关于UV坐标算点 和 PerlinNoise(柏林噪声)

 生成相关效果代码如下:

    public int w = 100;
    public int h = 100;

    public Texture2D texture;

    public Image image;

    public Color tu = Color.yellow;
    public Color cao = Color.green;
    
    // Start is called before the first frame update
    void Start()
    {
        texture = new Texture2D(w, h);
        VertexHelper vh = new VertexHelper();
        for (int x = 0; x < w; x++)
        {
            for (int z = 0; z < h; z++)
            {
                float y = Mathf.PerlinNoise(x * 0.1f, z * 0.1f);
                
                float uvx=(float)x/(float)(w-1);
                float uvy=(float)z/(float)(h-1);

                Color color = Color.Lerp(tu,cao,y);
                texture.SetPixel(x,z,color);
                vh.AddVert(new Vector3(x,y*10,z),Color.white,new Vector2(uvx,uvy));
                if (x!=w-1&&z!=h-1)
                {
                    vh.AddTriangle(x*h+z,x*h+z+1,(x+1)*h+z+1);
                    vh.AddTriangle(x*h+z,(x+1)*h+z+1,(x+1)*h+z);
                }
            }
        }
        
        texture.Apply();
        Mesh mesh = new Mesh();
        vh.FillMesh(mesh);
        GetComponent<MeshFilter>().mesh = mesh;
        GetComponent<MeshCollider>().sharedMesh = mesh;

        Material material = new Material(Shader.Find("Unlit/Transparent"));
        material.mainTexture = texture;
        GetComponent<MeshRenderer>().material = material;

        image.material = material;
    }

本文重点说的是这里:

                float uvx=(float)x/(float)(w-1);
                float uvy=(float)z/(float)(h-1);

                Color color = Color.Lerp(tu,cao,y);
                texture.SetPixel(x,z,color);
                vh.AddVert(new Vector3(x,y*10,z),Color.white,new Vector2(uvx,uvy));
                if (x!=w-1&&z!=h-1)
                {
                    vh.AddTriangle(x*h+z,x*h+z+1,(x+1)*h+z+1);
                    vh.AddTriangle(x*h+z,(x+1)*h+z+1,(x+1)*h+z);
                }

它批量渲染uv的一个思路,请对照基础介绍进行观看本文:里面官方示例简单的渲染了一个面

(48条消息) shader基础入门(2)(VertexHelper)_作孽就得先起床的博客-CSDN博客

最开始是这样渲染uv点位的

 然后代码是这样

            vh.AddTriangle(0, 1, 2);
            vh.AddTriangle(2, 3, 0);

但是在真正使用中顺序实际上是这样的

 然后结合一下上面的代码看

-------------------------------------------------------------

至于uv因它的数值为(0~1)范围(不准确这个说法,在最下方有说明),所以用边的比值最为合适,这样永远都会在这个合理的数值范围内,这样就能获得这个uv的x和y了,这样uv的部分基本结束

uv的基础知识,指路大佬链接:

uv纹理坐标设定与贴图规则 - bigwhiteshark(云飞扬) - 博客园 (cnblogs.com)

------------------------------------------------------------柏林噪声(PerlinNoise)--------------

关于这个函数(根据官网资料整理)

特点:伪随机数,在两个数值见逐步的往复

取得一个y值,线实际上是由规律的点组成的,太密了就成线了(图示大致效果如下)

柏林噪声是跨 2D 平面生成的浮点值的伪随机模式(尽管 该技术确实可以推广到三个或更多维度,这在 Unity 中没有实现)。 噪声在每个点上不包含完全随机的值,而是包含 的“波浪”,其值在整个模式中逐渐增加和减少。噪音可以 用作纹理效果的基础,也用作动画的基础,生成地形高度图 以及许多其他事情。

注意:返回值可能略小于 0.0f 或略高于 1.0f。您可能需要夹紧回程 值,如果 0.0 到 1.0 范围对您很重要。

返回的值它有可能比0.0还要小,可能会是负数,也有可能会稍微大于1.0

猜你喜欢

转载自blog.csdn.net/qq_46043095/article/details/128833393