失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > unity3d OpenGL实现画符功能

unity3d OpenGL实现画符功能

时间:2019-02-01 19:49:16

相关推荐

unity3d  OpenGL实现画符功能

一:实现一笔画符

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class DrawFu : MonoBehaviour {//第一步 屏幕写东西//1.记录屏幕上画的点 List 存储 鼠标输入点//1.1 视图坐标系 以屏幕分辨率大小为参考物(1024*768) 右上角(1,1) 左下角(0,0) UV坐标系//1.2 屏幕坐标系 以屏幕分辨率大小为参考物(1024*768) 右上角(1024,768,0) 左下角(0,0,0)//1.3 世界坐标系 以(0,0,0) 为起点//1.4 物体坐标系 以 父类 为参考物//2.显示点 输入点 链接起来//2.1 放一个image 当做画布//第二步 屏幕上写的东西映射到旗上 //1.在图片上生成对应的像素点//2.将 图片放到旗上private Image testImage;//存储所有点private List<Vector2> allPoints;//private Material targetMaterial;private void Start(){testImage = transform.GetComponent<Image>();allPoints = new List<Vector2>();targetMaterial = transform.GetComponent<Renderer>().material;}private void Update(){if (Input.GetMouseButton(0)){//获得鼠标的视图坐标系坐标Vector2 viewPoint = Camera.main.ScreenToViewportPoint(Input.mousePosition);allPoints.Add(viewPoint);}if (Input.GetMouseButtonUp(0)){GenerateTexture();}}public void GenerateTexture(){Texture2D temTexture = new Texture2D(300, 400);for (int i = 1; i < allPoints.Count; i++){//前一个点Vector2 temPos = allPoints[i - 1];//后一个点Vector2 temBack = allPoints[i];//插值100次for (int j = 0; j < 100; j++){//插值的比例float temxx = Mathf.Lerp(temPos.x, temBack.x, j / 100.0f);//插值的比例float temyy = Mathf.Lerp(temPos.y, temBack.y, j / 100.0f);//得到所有的比例点int xx = (int)(temTexture.width * temxx);int yy = (int)(temTexture.width * temyy);//赋值 画出点temTexture.SetPixel(xx, yy, Color.red);}}temTexture.Apply();targetMaterial.SetTexture("_MainTex", temTexture);allPoints.Clear();}static Material lineMaterial;static void CreateLineMaterial(){if (!lineMaterial){// Unity has a built-in shader that is useful for drawing// simple colored things.Shader shader = Shader.Find("Hidden/Internal-Colored");lineMaterial = new Material(shader);lineMaterial.hideFlags = HideFlags.HideAndDontSave;// Turn on alpha blendinglineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);// Turn backface culling offlineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);// Turn off depth writeslineMaterial.SetInt("_ZWrite", 0);}}// Will be called after all regular rendering is donepublic void OnRenderObject(){CreateLineMaterial();// Apply the line materiallineMaterial.SetPass(0);GL.PushMatrix();//将透视投影改为正交投影GL.LoadOrtho();// 划线开始GL.Begin(GL.LINES);//划线颜色GL.Color(Color.red);for (int i = 1; i < allPoints.Count; i ++){//前一个点Vector2 temPos = allPoints[i - 1];//后一个点Vector2 temBack = allPoints[i];//起点GL.Vertex3(temPos.x, temPos.y, 0);//终点GL.Vertex3(temBack.x, temBack.y, 0);}//划线结束GL.End();GL.PopMatrix();}}

二:实现多笔画符 存在问题 暂时不对

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class DrawFu : MonoBehaviour {//第一步 屏幕写东西//1.记录屏幕上画的点 List 存储 鼠标输入点//1.1 视图坐标系 以屏幕分辨率大小为参考物(1024*768) 右上角(1,1) 左下角(0,0) UV坐标系//1.2 屏幕坐标系 以屏幕分辨率大小为参考物(1024*768) 右上角(1024,768,0) 左下角(0,0,0)//1.3 世界坐标系 以(0,0,0) 为起点//1.4 物体坐标系 以 父类 为参考物//2.显示点 输入点 链接起来//2.1 放一个image 当做画布//第二步 屏幕上写的东西映射到旗上 //1.在图片上生成对应的像素点//2.将 图片放到旗上private Image testImage;//存储所有点private List<Vector2> allPoints;//private Material targetMaterial;//笔画数public int count = 2;//记录已画笔数private int temCount = 0;private void Start(){testImage = transform.GetComponent<Image>();allPoints = new List<Vector2>();targetMaterial = transform.GetComponent<Renderer>().material;}private void Update(){if (Input.GetMouseButton(0)){//获得鼠标的视图坐标系坐标Vector2 viewPoint = Camera.main.ScreenToViewportPoint(Input.mousePosition);allPoints.Add(viewPoint);}if (Input.GetMouseButtonUp(0)){temCount++;if (temCount == count){GenerateTexture();}}}public void GenerateTexture(){Texture2D temTexture = new Texture2D(300, 400);for (int i = 1; i < allPoints.Count; i++){//前一个点Vector2 temPos = allPoints[i - 1];//后一个点Vector2 temBack = allPoints[i];//插值100次for (int j = 0; j < 100; j++){//插值的比例float temxx = Mathf.Lerp(temPos.x, temBack.x, j / 100.0f);//插值的比例float temyy = Mathf.Lerp(temPos.y, temBack.y, j / 100.0f);//得到所有的比例点int xx = (int)(temTexture.width * temxx);int yy = (int)(temTexture.width * temyy);//赋值 画出点temTexture.SetPixel(xx, yy, Color.red);}}temTexture.Apply();targetMaterial.SetTexture("_MainTex", temTexture);allPoints.Clear();}static Material lineMaterial;static void CreateLineMaterial(){if (!lineMaterial){// Unity has a built-in shader that is useful for drawing// simple colored things.Shader shader = Shader.Find("Hidden/Internal-Colored");lineMaterial = new Material(shader);lineMaterial.hideFlags = HideFlags.HideAndDontSave;// Turn on alpha blendinglineMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);lineMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);// Turn backface culling offlineMaterial.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Off);// Turn off depth writeslineMaterial.SetInt("_ZWrite", 0);}}// Will be called after all regular rendering is donepublic void OnRenderObject(){CreateLineMaterial();// Apply the line materiallineMaterial.SetPass(0);GL.PushMatrix();//将透视投影改为正交投影GL.LoadOrtho();// 划线开始GL.Begin(GL.LINES);//划线颜色GL.Color(Color.red);for (int i = 1; i < allPoints.Count; i ++){//前一个点Vector2 temPos = allPoints[i - 1];//后一个点Vector2 temBack = allPoints[i];//起点GL.Vertex3(temPos.x, temPos.y, 0);//终点GL.Vertex3(temBack.x, temBack.y, 0);}//划线结束GL.End();GL.PopMatrix();}}

如果觉得《unity3d OpenGL实现画符功能》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。