【Unity3D】Unity3D Unity 几种画线方式
发布日期:2021-06-30 11:40:38
浏览次数:3
分类:技术文章
本文共 5078 字,大约阅读时间需要 16 分钟。
推荐阅读
【前言】
图形化调试可以加速开发。
例如在战斗中,可能需要知道所有单位的仇恨值,如果这些信息全打log的话,很难有直观感受, 而如果在Scene窗口里,单位头顶有一个球,越红表示仇恨越高,越暗表示仇恨越低,那么调试起来比打log直观多了。【一 、图形化调试】
Unity中图形化调试主要4种
- Debug.Draw
- Gizmos.Draw
- Graphic.DrawMesh
- GL
有两种情况
1.只需在Scene窗口显示的调试图像
- 一直显示的 OnDrawGizmos + Gizmos.Draw
- 选中显示的 OnDrawGizmosSelected + Gizmos.Draw
- 脚本控制的 Update + Debug.Draw
2.需要在实际设备屏幕显示的调试图像
- Update+Graphic.DrawMesh
- OnRenderObject+GL
Graphic.DrawMesh和Debug.Draw 调用一致,都是在Update系里
Graphic.DrawMesh和GL 显示类似,都在各个窗口显示,并且可以设置材质。四种方式比较
(1)Debug.Draw
- 一般在Update/Fixed Update/LateUpdate里调用
- 只在Scene窗口里显示
- 并且不能设置材质
void Update(){ Debug.DrawLine (worldPos1, worldPos2,Color.yellow);}
(2)Gizmos.Draw
- 在OnDrawGizmos /OnDrawGizmosSelected里调用
- 只在Scene窗口里显示
- 并且不能设置材质
public void OnDrawGizmosSelected() { Gizmos.DrawLine(Vector3.zero, new Vector3(0,3f,0));}
(3)Graphic.DrawMesh
- 一般在Update/Fixed Update/LateUpdate里调用
- 实际屏幕和Scene窗口都能显示
- 可以设置材质 画Mesh
void Update() { Graphics.DrawMesh(mesh, worldPos, worldRotation, material, 0); }
(4)GL
- 一般在物体的OnRenderObject 或者相机的OnPostRender里调用
- 实际屏幕和Scene窗口都能显示
- 可以设置材质
一个GL.Begin/GL.End里的渲染是自动合并的,一般是一个Drawcall
画一些线,三角可以。用GL.TRIANGLES 显示整个Mesh的话会超卡。例:渲染线框
void OnRenderObject() { mat.SetPass(0); GL.wireframe = true; GL.Color (new Color (1,1, 0, 0.8F)); GL.PushMatrix(); GL.Begin(GL.TRIANGLES); for(int i=0;i<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()里执行。 或者挂在物体上注意:
- GL的线等基本图元并没有uv. 所有是没有贴图纹理影射的,shader里仅仅做的是单色计算或者对之前的影像加以处理。
- GL所使用的shader里必须有Cull off指令,否则显示会变成如下
- 如果是线,颜色是GL.Color( new Color(1,1,1,0.5f) );设置的颜色
- 如果是GL.TRIANGLES或者是GL.QUADS,则颜色是shader里的颜色。
主要API解析
-
GL.PushMatrix()
保存matrices至matrix stack上。 -
GL.PopMatrix()
从matrix stack上读取matrices。 -
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) -
OnPostRender()
只有物体上有激活的摄像机时,才会调用的函数,当摄像机完成渲染场景,绘制了所有物体以后调用。 -
OnPostRender()
可以变成co-routine,加yield语句即可。 -
WaitForEndOfFrame()
等待至 所有绘制之后,end of frame, 就在展示frame到屏幕之前。可以做截图。可以在任何物体上使用该函数。
例1:屏幕画线
using UnityEngine; using System.Collections; public class GLTest : MonoBehaviour { public Material mat; void OnPostRender() { if (!mat) { Debug.LogError("Please Assign a material on the inspector"); return; } GL.PushMatrix(); //保存当前Matirx mat.SetPass(0); //刷新当前材质 GL.LoadPixelMatrix();//设置pixelMatrix GL.Color(Color.yellow); GL.Begin(GL.LINES); GL.Vertex3(0, 0, 0); GL.Vertex3(Screen.width, Screen.height, 0); GL.End(); GL.PopMatrix();//读取之前的Matrix } }
例2:截图
using System.IO; using UnityEngine; using System.Collections; public class ScreenShot : MonoBehaviour { void Start() { StartCoroutine(UploadPNG() ); } IEnumerator UploadPNG() { yield return new WaitForEndOfFrame(); print ("yuuuuu"); int width = Screen.width; int height = Screen.height; Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false); tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); tex.Apply(); byte[] bytes = tex.EncodeToPNG(); File.WriteAllBytes(Application.dataPath+"/ss.png",bytes); UnityEditor.AssetDatabase.Refresh(); } }
例3:展示Alpha
using UnityEngine; using System.Collections; public class GLTest : MonoBehaviour { public Shader shader; public Texture2D t2d; private Material mat; void Start() { mat = new Material(shader); mat.mainTexture = t2d; } void OnPostRender() { if (!mat) { Debug.LogError("Please Assign a material on the inspector"); return; } GL.PushMatrix(); mat.SetPass(0); GL.LoadOrtho(); GL.Begin(GL.QUADS); GL.Vertex3(0, 0, 0.1F); GL.Vertex3(1f, 0, 0.1F); GL.Vertex3(1f, 1, 0.1F); GL.Vertex3(0, 1, 0.1F); GL.End(); GL.PopMatrix(); } } Shader "Custom/GLDrawLine" { Properties { _MainTex ("Base (RGB)", 2D) = "white" { } } SubShader { Pass { Cull off Blend DstAlpha zero Color(1,1,1,1) } } }
转载地址:https://itmonon.blog.csdn.net/article/details/78630798 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月24日 12时25分18秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 之 Scatter散点图
2019-04-30
Python实现决策树 Desision Tree & 可视化
2019-04-30
决策树 Decision tree
2019-04-30
nominal和ordinal & 数据处理中四种基本数据类型
2019-04-30
Python 实现 Cross-validation
2019-04-30
Grid SearchCV(网格搜索)& Python实现
2019-04-30
ROS相关知识
2019-04-30
单目深度估计 monodepth2模型 代码
2019-04-30
位图索引Bitmap indexes
2019-04-30
YOLO算法(二)—— Yolov2 & yolo9000
2019-04-30
YOLO算法(三)—— Yolov3 & Yolo系列网络优缺点
2019-04-30
Python的__future__模块
2019-04-30
计算机视觉中的cost-volume的概念具体指什么(代价体积)
2019-04-30
启发函数heuristic 与 A*
2019-04-30