unity使用perlin噪声并保存为PNG图片

    xiaoxiao2022-07-05  149

    unity使用perlin噪声并保存为PNG图片。

    using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class perlinTest : MonoBehaviour { // Width and height of the texture in pixels. public int pixWidth; public int pixHeight; // The origin of the sampled area in the plane. public float xOrg; public float yOrg; // The number of cycles of the basic noise pattern that are repeated // over the width and height of the texture. public float scale = 1.0F; private Texture2D noiseTex; private Color[] pix; private Renderer rend; void Start() { rend = GetComponent<Renderer>(); // Set up the texture and a Color array to hold pixels during processing. noiseTex = new Texture2D(pixWidth, pixHeight); pix = new Color[noiseTex.width * noiseTex.height]; rend.material.mainTexture = noiseTex; } void CalcNoise() { // For each pixel in the texture... float y = 0.0F; while (y < noiseTex.height) { float x = 0.0F; while (x < noiseTex.width) { float xCoord = xOrg + x / noiseTex.width * scale; float yCoord = yOrg + y / noiseTex.height * scale; float sample = Mathf.PerlinNoise(xCoord, yCoord); pix[(int)y * noiseTex.width + (int)x] = new Color(sample, sample, sample); x++; } y++; } // Copy the pixel data to the texture and load it into the GPU. noiseTex.SetPixels(pix); noiseTex.Apply(); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { CalcNoise(); SaveRenderTextureToPNG(noiseTex, GetComponent<Renderer>().material.shader,"D:\\name", "ok"); } } public bool SaveRenderTextureToPNG(Texture2D inputTex, Shader outputShader, string contents, string pngName) { RenderTexture temp = RenderTexture.GetTemporary(inputTex.width, inputTex.height, 0, RenderTextureFormat.ARGB32); //Material mat = new Material(outputShader); Graphics.Blit(inputTex, temp); bool ret = SaveRenderTextureToPNG(temp, contents, pngName); RenderTexture.ReleaseTemporary(temp); return ret; } public bool SaveRenderTextureToPNG(RenderTexture rt, string contents, string pngName) { RenderTexture prev = RenderTexture.active; RenderTexture.active = rt; Texture2D png = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false); png.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); byte[] bytes = png.EncodeToPNG(); if (!Directory.Exists(contents)) Directory.CreateDirectory(contents); FileStream file = File.Open(contents + "/" + pngName + ".png", FileMode.Create); BinaryWriter writer = new BinaryWriter(file); writer.Write(bytes); file.Close(); Texture2D.DestroyImmediate(png); png = null; RenderTexture.active = prev; Debug.Log("12345"); return true; } }

    代码凑出来的,分为两个阶段,第一个阶段生成perlin噪声,第二个阶段将texture2D转为PNG并保存。

    脚本放在一个物体上,能看见。

    最新回复(0)