注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

转:Unity 画图效果  

2016-08-09 17:15:25|  分类: U3D |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
转自:http://blog.csdn.net/leekumbong/article/details/49908819
1.PS做一个带透明通道圆作为笔刷2.通过设置颜色把这个笔刷纹理渲染到RenderTexture上
[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System;  
  4. using System.Collections.Generic;  
  5. using System.Linq;  
  6. using System.IO;  
  7.   
  8. public class Painting : MonoBehaviour {  
  9.   
  10.     private RenderTexture texRender;  
  11.     public Material mat;  
  12.     public Texture  brushTypeTexture;  
  13.     private enum BrushColor  
  14.     {  
  15.         red,  
  16.         green,  
  17.         blue,  
  18.         pink,  
  19.         yellow,  
  20.         gray,  
  21.         black,  
  22.         white,  
  23.         count,  
  24.     }  
  25.     private float brushScale = 0.5f;  
  26.     private BrushColor brushColorType = BrushColor.black;  
  27.     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};  
  28.   
  29.     void Start () {  
  30.         texRender = new RenderTexture (Screen.width, Screen.height,24,RenderTextureFormat.ARGB32);  
  31.         Clear (texRender);  
  32.     }  
  33.   
  34.     Vector3 startPosition = Vector3.zero;  
  35.     Vector3 endPosition = Vector3.zero;  
  36.     void Update () {  
  37.   
  38.         if(Input.GetMouseButton(0))  
  39.         {  
  40.             OnMouseMove(new Vector3(Input.mousePosition.x,Input.mousePosition.y,0));  
  41.         }  
  42.         if(Input.GetMouseButtonUp(0))  
  43.         {  
  44.             OnMouseUp();  
  45.         }  
  46.     }  
  47.   
  48.     void OnMouseUp()  
  49.     {  
  50.         startPosition = Vector3.zero;  
  51.     }  
  52.   
  53.     void OnMouseMove(Vector3 pos)  
  54.     {  
  55.         endPosition = pos;  
  56.         DrawBrush(texRender,(int)endPosition.x,(int)endPosition.y,brushTypeTexture,brushColor[(int)brushColorType],brushScale);  
  57.           
  58.         if(startPosition.Equals(Vector3.zero))  
  59.         {  
  60.             startPosition = endPosition;  
  61.             return;  
  62.         }  
  63.   
  64.         float distance = Vector3.Distance(startPosition,endPosition);  
  65.         if (distance > 1)  
  66.         {  
  67.             int d = (int)distance;  
  68.             for (int i = 0; i < d; i++)  
  69.             {  
  70.                 float difx = endPosition.x - startPosition.x;  
  71.                 float dify = endPosition.y - startPosition.y;  
  72.                 float delta = (float)i / distance;  
  73.                 DrawBrush(texRender,new Vector2(startPosition.x + (difx * delta), startPosition.y + (dify * delta)),brushTypeTexture,brushColor[(int)brushColorType],brushScale);  
  74.             }  
  75.         }  
  76.         startPosition = endPosition;  
  77.     }  
  78.   
  79.     void Clear(RenderTexture destTexture)  
  80.     {  
  81.         Graphics.SetRenderTarget (destTexture);       
  82.         GL.PushMatrix();  
  83.         GL.Clear(true,true,Color.white);  
  84.         GL.PopMatrix();  
  85.     }  
  86.   
  87.     void DrawBrush(RenderTexture destTexture,Vector2 pos,Texture sourceTexture,Color color,float scale)  
  88.     {  
  89.         DrawBrush (destTexture,(int)pos.x, (int)pos.y, sourceTexture,color,scale);            
  90.     }  
  91.   
  92.     void DrawBrush(RenderTexture destTexture,int x,int y,Texture sourceTexture,Color color,float scale)  
  93.     {  
  94.         DrawBrush (destTexture, new Rect (x, y, sourceTexture.width, sourceTexture.height), sourceTexture,color,scale);  
  95.     }  
  96.   
  97.     void DrawBrush(RenderTexture destTexture,Rect destRect,Texture sourceTexture,Color color,float scale)  
  98.     {     
  99.         float left = destRect.left - destRect.width*scale / 2.0f;  
  100.         float right = destRect.left + destRect.width*scale / 2.0f;  
  101.         float top = destRect.top - destRect.height*scale / 2.0f;  
  102.         float bottom = destRect.top + destRect.height*scale / 2.0f;  
  103.   
  104.         Graphics.SetRenderTarget (destTexture);  
  105.   
  106.         GL.PushMatrix();  
  107.         GL.LoadOrtho();  
  108.   
  109.         mat.SetTexture("_MainTex",brushTypeTexture);  
  110.         mat.SetColor ("_Color",color);  
  111.         mat.SetPass(0);   
  112.   
  113.         GL.Begin(GL.QUADS);  
  114.   
  115.         GL.TexCoord2(0.0f, 0.0f); GL.Vertex3(left/Screen.width, top/Screen.height, 0);  
  116.         GL.TexCoord2(1.0f, 0.0f); GL.Vertex3(right/Screen.width, top/Screen.height, 0);      
  117.         GL.TexCoord2(1.0f, 1.0f); GL.Vertex3(right/Screen.width, bottom/Screen.height, 0);  
  118.         GL.TexCoord2(0.0f, 1.0f); GL.Vertex3(left/Screen.width, bottom/Screen.height, 0);  
  119.   
  120.         GL.End();     
  121.         GL.PopMatrix();  
  122.     }  
  123.   
  124.     bool bshow = true;  
  125.     void OnGUI() {    
  126.   
  127.         if(bshow)  
  128.         {  
  129.             GUI.DrawTexture(new Rect(0,0,Screen.width,Screen.height),texRender,ScaleMode.StretchToFill);  
  130.         }  
  131.   
  132.         if(GUI.Button(new Rect(0,150,100,30),"clear"))  
  133.         {  
  134.             Clear (texRender);  
  135.         }  
  136.   
  137.         if(GUI.Button(new Rect(100,150,100,30),"hide"))  
  138.         {  
  139.             bshow = !bshow;  
  140.         }  
  141.   
  142.         int width = Screen.width / (int)BrushColor.count;  
  143.   
  144.         for(int i=0; i<(int)BrushColor.count; i++)  
  145.         {  
  146.             if(GUI.Button(new Rect(i*width,0,width,30),Enum.GetName(typeof(BrushColor),i)))  
  147.             {  
  148.                 brushColorType = (BrushColor)i;  
  149.             }  
  150.         }  
  151.   
  152.         GUI.Label (new Rect (0, 200, 300, 30), "brushScale : " + brushScale.ToString("F2"));  
  153.         brushScale = (int)GUI.HorizontalSlider (new Rect (120, 205, 200, 30), brushScale*10.0f, 1, 50) / 10.0f;  
  154.         if(brushScale < 0.1f)  
  155.             brushScale = 0.1f;  
  156.     }  
  157. }  
[plain] view plain copy
  1. Shader "Painting"  
  2. {  
  3.     Properties  
  4.     {  
  5.         _MainTex ("MainTex (RGB) Trans (A)", 2D) = "white" {}  
  6.         _Color ("Color", Color) = (1,1,1,1)  
  7.     }  
  8.   
  9.     SubShader  
  10.     {  
  11.         Tags  
  12.         {   
  13.             "Queue"="Transparent"   
  14.             "IgnoreProjector"="True"   
  15.             "RenderType"="Transparent"   
  16.             "PreviewType"="Plane"  
  17.             "CanUseSpriteAtlas"="True"  
  18.         }  
  19.   
  20.         Cull Off  
  21.         Lighting Off  
  22.         ZWrite Off  
  23.         Fog { Mode Off }  
  24.         Blend One OneMinusSrcAlpha  
  25.   
  26.         Pass  
  27.         {  
  28.             CGPROGRAM  
  29.             #pragma vertex vert  
  30.             #pragma fragment frag  
  31.             #include "UnityCG.cginc"  
  32.   
  33.             struct v2f  
  34.             {  
  35.                 float4 vertex : SV_POSITION;  
  36.                 half2 texcoord : TEXCOORD0;  
  37.             };  
  38.   
  39.             fixed4 _Color;  
  40.   
  41.             v2f vert(appdata_base IN)  
  42.             {  
  43.                 v2f OUT;  
  44.                 OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);  
  45.                 OUT.texcoord = IN.texcoord;  
  46.                 return OUT;  
  47.             }  
  48.   
  49.             sampler2D _MainTex;  
  50.   
  51.             fixed4 frag(v2f IN) : SV_Target  
  52.             {  
  53.                 float4 col = _Color * tex2D(_MainTex, IN.texcoord);  
  54.                 col.rgb *= col.a;  
  55.                 return col;  
  56.             }  
  57.             ENDCG  
  58.         }  
  59.     }  
  60. }  
  评论这张
 
阅读(98)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017