Unity3D实现描边框效果
程序员文章站
2023-10-31 08:25:52
unity3d描边框效果网上有很多,大多是使用shader来实现的本文介绍使用collider来实现这么一种效果效果图如下将物体添加collider(box collider、mesh collide...
unity3d描边框效果网上有很多,大多是使用shader来实现的
本文介绍使用collider来实现这么一种效果
效果图如下
将物体添加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条边通过画线形式渲染出来!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Android自定义控件实现望远镜效果
下一篇: 孕妇鼻塞怎么办 孕妇鼻塞可以吃药吗