生成相关效果代码如下:
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