欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Unity3D实现描边框效果

程序员文章站 2023-10-31 08:25:52
unity3d描边框效果网上有很多,大多是使用shader来实现的本文介绍使用collider来实现这么一种效果效果图如下将物体添加collider(box collider、mesh collide...

unity3d描边框效果网上有很多,大多是使用shader来实现的

本文介绍使用collider来实现这么一种效果

效果图如下

Unity3D实现描边框效果

将物体添加collider(box collider、mesh collider......)

每个collider都有自己的边界bound,描边效果就是将bound显示出来

代码如下

using system.collections;
using system.collections.generic;
using unityengine;
using unityeditor;
 
public class showboxcollider : monobehaviour
{
 void onrenderobject()
 {
  var colliders = gameobject.getcomponents<collider>();
  if (colliders == null)
  {
   return;
  }
  //创建并设置线条材质
  createlinematerial();
  linematerial.setpass(0);
  gl.pushmatrix();
  //这里无需将矩阵从本地坐标转化为世界左边
  //gl.multmatrix(transform.localtoworldmatrix);
 
  for (int i = 0; i < colliders.length; i++)
  {
   var col = colliders[i];
   //获取本物体对象在世界范围内的中心点位置 col.center是本地坐标位置
   var c = col.bounds.center;
   //collider大小
   var size = col.bounds.size;
   float rx = size.x / 2f;
   float ry = size.y / 2f;
   float rz = size.z / 2f;
   //获取collider边界的8个顶点位置
   vector3 p0, p1, p2, p3;
   vector3 p4, p5, p6, p7;
   p0 = c + new vector3(-rx, -ry, rz);
   p1 = c + new vector3(rx, -ry, rz);
   p2 = c + new vector3(rx, -ry, -rz);
   p3 = c + new vector3(-rx, -ry, -rz);
 
   p4 = c + new vector3(-rx, ry, rz);
   p5 = c + new vector3(rx, ry, rz);
   p6 = c + new vector3(rx, ry, -rz);
   p7 = c + new vector3(-rx, ry, -rz);
 
   //画线
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p0);
   gl.vertex(p1);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p1);
   gl.vertex(p2);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p2);
   gl.vertex(p3);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p0);
   gl.vertex(p3);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p4);
   gl.vertex(p5);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p5);
   gl.vertex(p6);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p6);
   gl.vertex(p7);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p4);
   gl.vertex(p7);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p0);
   gl.vertex(p4);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p1);
   gl.vertex(p5);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p2);
   gl.vertex(p6);
   gl.end();
 
   gl.begin(gl.lines);
   gl.color(color.cyan);
   gl.vertex(p3);
   gl.vertex(p7);
   gl.end();
  }
  gl.popmatrix();
 }
 
 static material linematerial;
 static void createlinematerial()
 {
  if (!linematerial)
  {
   // unity3d使用该默认的shader作为线条材质 
   shader shader = shader.find("hidden/internal-colored");
   linematerial = new material(shader);
   linematerial.hideflags = hideflags.hideanddontsave;
   // 开启 alpha blending 
   linematerial.setint("_srcblend", (int)unityengine.rendering.blendmode.srcalpha);
   linematerial.setint("_dstblend", (int)unityengine.rendering.blendmode.oneminussrcalpha);
   // 开启背面遮挡 
   linematerial.setint("_cull", (int)unityengine.rendering.cullmode.off);
   // turn off depth writes 
   linematerial.setint("_zwrite", 0);
  }
 }
}

使用gl将bound的8条边通过画线形式渲染出来!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。