【一 图形化调试】
Unity中图形化调试主要4种
Debug.Draw
Gizmos.Draw
Graphic.DrawMesh
GL
只需在Scene窗口显示的调试图像
一直显示的 OnDrawGizmos +
选中显示的 OnDrawGizmosSelected
需要在实际设备屏幕显示的调试图像
OnRenderObject+GL
显示类似,都在各个窗口显示,并且可以设置材质。
四种方式比较
(1)Debug.Draw
=1=一般在Update/Fixed Update/LateUpdate里调用
=2=只在Scene窗口里显示
=3=并且不能设置材质
voidUpdate()
{
Debug.DrawLine(worldPos1,worldPos2,Color.yellow);
}
(2)Gizmos.Draw
OnDrawGizmos /OnDrawGizmosSelected里调用
=2=只在Scene窗口里显示
=3=并且不能设置材质
publicvoidOnDrawGizmosSelected(){
Gizmos.DrawLine(Vector3.zero,newVector3(0,3f,0));
}
(3)Graphic.DrawMesh
=1=一般在Update/Fixed Update/LateUpdate里调用
=2=实际屏幕和Scene窗口都能显示
=3=可以设置材质
画Mesh Ok
voidUpdate()
{
Graphics.DrawMesh(mesh,worldPos,worldRotation,material,0);
}
(4)GL,
=1=一般在物体的OnRenderObject 或者相机的OnPostRender里调用
=2=实际屏幕和Scene窗口都能显示
=3=可以设置材质
一个GL.Begin/GL.End里的渲染是自动合并的,一般是一个Drawcall
画一些线,三角可以。用
GL.TRIANGLES 显示整个Mesh的话会超卡。
例:渲染线框
voidOnRenderObject()
{
mat.SetPass(0);
.wireframe=true;
GL.Color(newColor(1,1,0,0.8F));
GL.PushMatrix();
GL.Begin(GL.TRIANGLES);
for(inti=0;i<</span>mesh.triangles.Length-2;i+=3)
{
GL.Vertex(mesh.vertices[mesh.triangles[i]]);
GL.Vertex(mesh.vertices[mesh.triangles[i+1]]);
GL.Vertex(mesh.vertices[mesh.triangles[i+2]]);
}
GL.End();
GL.PopMatrix();
GL.wireframe=false;
}
【二 GL】
GL除了可以用来调试,可以拿来做功能,例如LineRenderer,地格等。
GL即Graphics Library。Low-Level Graphics Library。计算matrices,发出类似OpenGL的immediate模式的渲染指令,和其他低级图像任务。Graphic.DrawMesh()比GL更高效。
GL立即绘制函数只用当前material的设置。因此除非你显示指定mat,否则mat可以是任何材质。并且GL可能会改变材质。
GL是立即执行的,如果你在Update()里调用,它们将在相机渲染前执行,相机渲染将会清空屏幕,GL效果将无法看到。
通常GL用法是
在camera上贴脚本,并在OnPostRender()里执行。
也可以挂在任何GameObject上,在OnRenderObject()里执行。
或者挂在物体上
1.GL的线等基本图元并没有uv. 所有是没有贴图纹理影射的,shader里仅仅做的是单色计算或者对之前的影像加以处理。
2.GL所使用的shader里必须有Cull off指令,否则显示会变成如下
.Color ( new Color ( 1 , 1 , 1 , 0.5f ) );设置的颜色
如果是GL.TRIANGLES或者是 GL.QUADS,则颜色是shader里的颜色。
1.
GL.PushMatrix()
保存matrices至matrix stack上。
GL.PopMatrix()
从matrix stack上读取matrices。
2.
GL.LoadPixelMatrix()
改变MVP矩阵,使得transform里的xy 直接对应像素,(0,0)表示屏幕viewport的左下角,z的范围是(-1,1),该函数改变camera的参数,所以需要GL.PushMatrix()保存和GL.PopMatrix()读取。
GL.Vertex3()的取值范围从左下角的(0,0,0) 至右上角的(Screen.width,Screen.height,0)
GL.LoadOrtho()
设置ortho perspective,即水平视角。After calling LoadOrtho, the viewing frustum goes from (0,0,-1) to (1,1,100). 主要用于在纯2D里绘制图元。
GL .Vertex3()的取值范围从左下角的(0,0,0) 至右上角的(1,1,0)
3.
OnPostRender()
只有物体上有激活的摄像机时,才会调用的函数,当摄像机完成渲染场景,绘制了所有物体以后调用。
OnPostRender可以变成co-routine,加yield语句即可。
WaitForEndOfFrame()
等待至 所有绘制之后,end of frame, 就在展示frame到屏幕之前。可以做截图。可以在任何物体上使用该函数。
[csharp] view plain copy
1. 例1:屏幕画线
2.
3. using UnityEngine;
4. using System.Collections;
5.
6. public class GLTest : MonoBehaviour {
7.
8. public Material mat;
9. void OnPostRender() {
10. if (!mat) {
11. "Please Assign a material on the inspector");
12. return;
13. }
14. //保存当前Matirx
15. //刷新当前材质
16. //设置pixelMatrix
17. GL.Color(Color.yellow);
18. GL.Begin(GL.LINES);
19. GL.Vertex3(0, 0, 0);
20. GL.Vertex3(Screen.width, Screen.height, 0);
21. GL.End();
22. //读取之前的Matrix
23. }
24. }
[csharp] view plain copy
1. 例2:截图
2.
3. using System.IO;
4. using UnityEngine;
5. using System.Collections;
6.
7. public class ScreenShot : MonoBehaviour {
8. void Start() {
9. StartCoroutine(UploadPNG() );
10. }
11. IEnumerator UploadPNG() {
12. return new WaitForEndOfFrame();
13. print ("yuuuuu");
14. int width = Screen.width;
15. int height = Screen.height;
16. new Texture2D(width, height, TextureFormat.RGB24, false);
17. new Rect(0, 0, width, height), 0, 0);
18. tex.Apply();
19. byte[] bytes = tex.EncodeToPNG();
20. File.WriteAllBytes(Application.dataPath+"/ss.png",bytes);
21. UnityEditor.AssetDatabase.Refresh();
22. }
23. }
[csharp] view plain copy
1. 例3:展示Alpha
2.
3.
4. using UnityEngine;
5. using System.Collections;
6.
7. public class GLTest : MonoBehaviour {
8. public Shader shader;
9. public Texture2D t2d;
10. private Material mat;
11. void Start()
12. {
13. mat = new Material(shader);
14. mat.mainTexture = t2d;
15. }
16. void OnPostRender() {
17. if (!mat) {
18. "Please Assign a material on the inspector");
19. return;
20. }
21. GL.PushMatrix();
22. mat.SetPass(0);
23. GL.LoadOrtho();
24. GL.Begin(GL.QUADS);
25. GL.Vertex3(0, 0, 0.1F);
26. GL.Vertex3(1f, 0, 0.1F);
27. GL.Vertex3(1f, 1, 0.1F);
28. GL.Vertex3(0, 1, 0.1F);
29. GL.End();
30. GL.PopMatrix();
31. }
32. }
33. Shader "Custom/GLDrawLine" {
34. Properties {
35. _MainTex ("Base (RGB)", 2D) = "white" {}
36. }
37. SubShader {
38. Pass {
39. Cull off
40. Blend DstAlpha zero
41. Color(1,1,1,1)
42. }
43. }
44. }