Unity 画图效果

原创 2015年11月18日 16:19:20
1.PS做一个带透明通道圆作为笔刷2.通过设置颜色把这个笔刷纹理渲染到RenderTexture上
using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

public class Painting : MonoBehaviour {

	private RenderTexture texRender;
	public Material mat;
	public Texture  brushTypeTexture;
	private enum BrushColor
	{
		red,
		green,
		blue,
		pink,
		yellow,
		gray,
		black,
		white,
		count,
	}
	private float brushScale = 0.5f;
	private BrushColor brushColorType = BrushColor.black;
	private Color [] brushColor = new Color[(int)BrushColor.count] {Color.red,Color.green,Color.blue,new Color(255,0,255),Color.yellow,Color.gray,Color.black,Color.white};

	void Start () {
		texRender = new RenderTexture (Screen.width, Screen.height,24,RenderTextureFormat.ARGB32);
		Clear (texRender);
	}

	Vector3 startPosition = Vector3.zero;
	Vector3 endPosition = Vector3.zero;
	void Update () {

		if(Input.GetMouseButton(0))
		{
			OnMouseMove(new Vector3(Input.mousePosition.x,Input.mousePosition.y,0));
		}
		if(Input.GetMouseButtonUp(0))
		{
			OnMouseUp();
		}
	}

	void OnMouseUp()
	{
		startPosition = Vector3.zero;
	}

	void OnMouseMove(Vector3 pos)
	{
		endPosition = pos;
		DrawBrush(texRender,(int)endPosition.x,(int)endPosition.y,brushTypeTexture,brushColor[(int)brushColorType],brushScale);
		
		if(startPosition.Equals(Vector3.zero))
		{
			startPosition = endPosition;
			return;
		}

		float distance = Vector3.Distance(startPosition,endPosition);
		if (distance > 1)
		{
			int d = (int)distance;
			for (int i = 0; i < d; i++)
			{
				float difx = endPosition.x - startPosition.x;
				float dify = endPosition.y - startPosition.y;
				float delta = (float)i / distance;
				DrawBrush(texRender,new Vector2(startPosition.x + (difx * delta), startPosition.y + (dify * delta)),brushTypeTexture,brushColor[(int)brushColorType],brushScale);
			}
		}
		startPosition = endPosition;
	}

	void Clear(RenderTexture destTexture)
	{
		Graphics.SetRenderTarget (destTexture);		
		GL.PushMatrix();
		GL.Clear(true,true,Color.white);
		GL.PopMatrix();
	}

	void DrawBrush(RenderTexture destTexture,Vector2 pos,Texture sourceTexture,Color color,float scale)
	{
		DrawBrush (destTexture,(int)pos.x, (int)pos.y, sourceTexture,color,scale);			
	}

	void DrawBrush(RenderTexture destTexture,int x,int y,Texture sourceTexture,Color color,float scale)
	{
		DrawBrush (destTexture, new Rect (x, y, sourceTexture.width, sourceTexture.height), sourceTexture,color,scale);
	}

	void DrawBrush(RenderTexture destTexture,Rect destRect,Texture sourceTexture,Color color,float scale)
	{	
		float left = destRect.left - destRect.width*scale / 2.0f;
		float right = destRect.left + destRect.width*scale / 2.0f;
		float top = destRect.top - destRect.height*scale / 2.0f;
		float bottom = destRect.top + destRect.height*scale / 2.0f;

		Graphics.SetRenderTarget (destTexture);

		GL.PushMatrix();
		GL.LoadOrtho();

		mat.SetTexture("_MainTex",brushTypeTexture);
		mat.SetColor ("_Color",color);
		mat.SetPass(0);	

		GL.Begin(GL.QUADS);

		GL.TexCoord2(0.0f, 0.0f); GL.Vertex3(left/Screen.width, top/Screen.height, 0);
		GL.TexCoord2(1.0f, 0.0f); GL.Vertex3(right/Screen.width, top/Screen.height, 0);    
		GL.TexCoord2(1.0f, 1.0f); GL.Vertex3(right/Screen.width, bottom/Screen.height, 0);
		GL.TexCoord2(0.0f, 1.0f); GL.Vertex3(left/Screen.width, bottom/Screen.height, 0);

		GL.End();	
		GL.PopMatrix();
	}

	bool bshow = true;
	void OnGUI() {	

		if(bshow)
		{
			GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),texRender,ScaleMode.StretchToFill);
		}

		if(GUI.Button(new Rect(0,150,100,30),"clear"))
		{
			Clear (texRender);
		}

		if(GUI.Button(new Rect(100,150,100,30),"hide"))
		{
			bshow = !bshow;
		}

		int width = Screen.width / (int)BrushColor.count;

		for(int i=0; i<(int)BrushColor.count; i++)
		{
			if(GUI.Button(new Rect(i*width,0,width,30),Enum.GetName(typeof(BrushColor),i)))
			{
				brushColorType = (BrushColor)i;
			}
		}

		GUI.Label (new Rect (0, 200, 300, 30), "brushScale : " + brushScale.ToString("F2"));
		brushScale = (int)GUI.HorizontalSlider (new Rect (120, 205, 200, 30), brushScale*10.0f, 1, 50) / 10.0f;
		if(brushScale < 0.1f)
			brushScale = 0.1f;
	}
}
Shader "Painting"
{
	Properties
	{
		_MainTex ("MainTex (RGB) Trans (A)", 2D) = "white" {}
		_Color ("Color", Color) = (1,1,1,1)
	}

	SubShader
	{
		Tags
		{ 
			"Queue"="Transparent" 
			"IgnoreProjector"="True" 
			"RenderType"="Transparent" 
			"PreviewType"="Plane"
			"CanUseSpriteAtlas"="True"
		}

		Cull Off
		Lighting Off
		ZWrite Off
		Fog { Mode Off }
		Blend One OneMinusSrcAlpha

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct v2f
			{
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
			};

			fixed4 _Color;

			v2f vert(appdata_base IN)
			{
				v2f OUT;
				OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
				OUT.texcoord = IN.texcoord;
				return OUT;
			}

			sampler2D _MainTex;

			fixed4 frag(v2f IN) : SV_Target
			{
				float4 col = _Color * tex2D(_MainTex, IN.texcoord);
				col.rgb *= col.a;
				return col;
			}
			ENDCG
		}
	}
}




                

unity--鼠标画线、画图实现

http://blog.csdn.net/chenggong2dm/article/details/24488469 首先让我们来看一下效果: 实现方法: 1...
  • spring_shower
  • spring_shower
  • 2015年10月21日 15:21
  • 2589

在unity里绘图板 制作一个画板的几种思路和原理

写这个的原因是绘画方面的内容在unity里还是很弱的,没有opengl 或者以前flash那样直观又容易操作, 当然unity里其他很好用,当如如果使用unity里GL底层来控制,虽然可以但是缺乏与其...
  • shenmifangke
  • shenmifangke
  • 2016年02月19日 16:02
  • 5417

unity--鼠标画线、画图实现

在untiy有时候需要用到画线,比如说在做签名或者画图的时候,主要用的组件就是LineRenderer实现代码 using UnityEngine; using System.Collections...
  • liang_704959721
  • liang_704959721
  • 2015年04月03日 09:10
  • 4441

【Unity3D】平面绘图——GL与GUI

在Unity3D中绘制一个平面图形可不容易,可别惯性思维觉得,嗯,这引擎3D的事情都能解决了,2D的不叫事情。其实除去布置UI,在Unity3D中绘制一个2D平面图形是很蛋疼的一件事情。不然的话,也不...
  • yongh701
  • yongh701
  • 2017年05月09日 15:48
  • 2410

【Unity】Unity 几种画线方式

转载地址:http://blog.sina.com.cn/s/blog_471132920101gxzf.html 【前言】 图形化调试可以加速开发。 例如在战斗中,可能需要...
  • ldy597321444
  • ldy597321444
  • 2017年09月19日 16:11
  • 3600

[Unity]适合独立开发者的几款画图软件

位图编辑:GIMP. 矢量绘图:Inkscape. krita 虽然有很多破解的软件,但还是要支持一下正版的。 参考资料: 1. 有哪些免费好用的绘图软件? 2. 3....
  • BuladeMian
  • BuladeMian
  • 2017年06月26日 20:32
  • 836

Unity 画图效果

  • 2015年11月18日 16:51
  • 28KB
  • 下载

Unity3d 实现画板效果

using System.Collections; using System.Collections.Generic; using UnityEngine;public class player : ...
  • q764424567
  • q764424567
  • 2018年01月03日 15:02
  • 126

Unity3D实践系列10, Canvas画布的创建和使用

Canvas是所有ui元素的父物体。   当添加一个Button类型的GameObject后,在"Hierarch"窗口中自动添加了一个Canvas,以及EventSystem。  ...
  • oldherowang
  • oldherowang
  • 2017年07月06日 19:25
  • 582

Unity3d实现画笔

本文介绍如何在unity3d中实现画笔的功能 首先画笔需要一个材质 Material,之前在网上找了很多画笔,但是都没说材质怎么生成,导致画不出线来。 创建材质: Material rectMat =...
  • Ensue
  • Ensue
  • 2015年08月01日 10:25
  • 4740
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity 画图效果
举报原因:
原因补充:

(最多只允许输入30个字)