Unity大面积草地渲染——3、使用GPUInstancing渲染大面积的草

101 篇文章 93 订阅
订阅专栏

目录
1、Shader控制一棵草的渲染
2、草地的动态交互
3、使用GPUInstancing渲染大面积的草
4、对大面积草地进行区域剔除和显示等级设置

大家好,我是阿赵。
这里开始讲大面积草地渲染的第三个部分,使用GPU Instancing来渲染大面积的草。

一、在不使用GPU Instancing时的渲染情况

为了能看性能明显一点,我写了个工具,在10乘10的范围内生成了一万棵草。
在这里插入图片描述

由于我的电脑显卡不算很差,所以可以看得到fps还能维持一百多。看看下面的参数,可以发现,渲染的三角形数有120多万,Batches有8517次,Saved by batching是0次,然后实际SetPass有8次。
这些数据代表了什么呢?
首先,为什么Batches有8千多次呢?
这是因为,我这里所有的草都是使用了同一个材质球,而同一个材质球按道理来说是可以合并渲染的。Batches指的是在运行过程中,通过消耗CPU的性能,每一帧动态的去判断哪些模型可以合并渲染,然后进行合并,最后推送到渲染管线。虽然我生成了10000棵草,但并不是所有草都进入到摄像机的裁剪视锥,只有8000多棵进入了,所以Batches是8000多。
在这里插入图片描述

如果把摄像机拉远一点,然后把地面隐藏了,在看到10000棵草的情况下,这个Batches就是10001了。10000棵草,再加一个背景色。

然后,为什么Saved by batching是0次呢?
所谓的Saved by batching,指的是计算完一次的合并数据,可以保存下来,下一帧不需要再重新计算,就可以直接的渲染了。因为这些草都是自然渲染的,没有经过任何技术的预处理,所以并没有可以保存的合并渲染数据,只能每一帧都重复的去计算。所以Saved by batching是0次,也就是完全没有。

最后,SetPass calls是8次,说明了实际上GPU执行了8次的渲染。由于GPU是并行计算的,根据显卡的性能,一次渲染可能可以渲染数百万个三角形,所以在上面已经Batches合批的情况下,显卡可以把所有草一次渲染完。从上面拉远了之后把地面隐藏的结果看,SetPass calls变成了2次。这是因为其中有6次是那个地面渲染导致的。没有了地面之后,所有草一次,背景色一次,所以是2次。

所以,最后得到的结果是,如果在显卡性能还比较好的情况下,这次的渲染并没有什么压力,因为只有2次SetPass。但对CPU的压力比较大,每一帧需要计算上万次的合批数据。这里的帧数看着还过得去,是因为我的电脑CPU也还过得去,是第10代的i7处理器。
至于面数的问题,120万面是有点多的,这个问题的解决办法我会在下一篇文章里面说,这里先不讨论。
从经验上来说,我们做游戏,特别是手机游戏,Batches的数量一般要控制在100左右,不然CPU每一帧都高负荷的计算,虽然可能不掉帧,但发热是肯定的。可能游戏运行5分钟,你的手机就已经烫到拿不住了。

于是,我们要想办法去考虑一下,怎样把合批的次数给降低?
Unity其实一直有提供2种合批方式,一种是刚才通过CPU的动态合批,另外一种是静态合批。
静态合批的使用很简单,直接选择需要合批的东西,然后勾选Batching Static选项就可以了。
在这里插入图片描述

于是也可以试试,如果用静态合批,会有怎样的结果:
在这里插入图片描述

从数据上看,Batches大幅度的降低了,好像结果不错。但仔细看场景里面的草,会发现颜色发生了变化。
然后静态合批还有一个很重要的特点,就是参与了静态合批的模型,它们的网格是已经合并成一个大网格了,所以在运行的时候,你可以显示隐藏某个模型,但不能移动、旋转或者缩放某个模型了。
这里我勾选了静态合批之后,风吹草的动画和球体交互的动画还是可以播放的,这是因为虽然合并成了大网格,但Shader里面的顶点程序还是能根据顶点坐标正常的计算。

二、使用GPU Instancing时的渲染情况

从这里开始,我们试一下使用GPU Instancing功能,看看效果如何。
在这里插入图片描述

这是使用了GPU Instancing之后的性能情况,可以看到,Batches降低到24,根据上面的经验。然后Saved by batching变成了8000多个,三角面数是120万,SetPass数还是8
在这里插入图片描述

和上面的做法一样,拉远了摄像机,并且把地面隐藏了,可以看到实际Batches是21,SetPass calls是2。
从结果可以看出,使用了GPU Instancing之后,渲染的三角面数并没有降低,但Batches降低了,比之前的静态合批还低,这是因为静态合批的大模型网格还是要遵循Unity本身一个网格的顶点数不能超过65536个的规则,而GPU Instancing是没有这个限制,但同一个渲染批次渲染的物体最大只能1023个。
在Batches大幅度降低之后,草地上的草从外观上看并没有什么变化,而且每棵草都可以移动、旋转和缩放,没有任何限制。

三、怎样使用GPU Instancing

1、Shader修改

在这里插入图片描述

使用GPU Instancing的方式很简单,在材质球上面勾选Enable GPU Instancing,就可以了。
不过如果你自己写Shader,会发现材质球上面根本没有这个选项。如果想出现这个选项,需要在Shader里面加点东西:
(1)#pragma multi_compile_instancing
(2)在appdata和v2f结构体里面添加UNITY_VERTEX_INPUT_INSTANCE_ID
(3)在顶点程序和片段程序里面添加UNITY_SETUP_INSTANCE_ID

2、程序调用渲染方法

刚刚介绍的方法,是直接把勾选了Enable GPU Instancing的模型放在场景里面渲染,还可以有另外一种方式,不需要在场景里面摆放模型,而是通过使用渲染的API,传入需要渲染的网格模型、材质球,还有需要摆放模型的Matrix4x4矩阵,让程序自己去渲染。
可以使用的API有2种,各位可以查阅Unity自带的帮助文档:

1.Graphics.DrawMeshInstanced

在这里插入图片描述

使用方法举例:

Graphics.DrawMeshInstanced(mesh, 0, mat, matrixs, matrixs.Length);

之前漏了说,这个API一次渲染的长度是不能超过1023的,所以这里的matrixs矩阵数组,我们要自己计算一下长度,如果超出了1023个,就要新建数组来继续存放。

2.CommandBuffer.DrawMeshInstanced

在这里插入图片描述

使用方法举例:

CommandBuffer mBuff = new CommandBuffer();
mBuff.DrawMeshInstanced(mesh, 0, mat,0, matrixs, matrixs.Length);
Camera.main.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, mBuff);

四、完整Shader

Shader "azhao/Grass"
{
    Properties
    {
		_MainTex("MainTex", 2D) = "white" {}
		_hmin("hmin", Range(0 , 1)) = 0
		_hmax("hmax", Range(0 , 1)) = 1
		_hOffset("hOffset", Range(-1 , 1)) = 0
		_vmin("vmin", Range(0 , 1)) = 0
		_vmax("vmax", Range(0 , 1)) = 1
		_vOffset("vOffset", Range(-5 , 5)) = 0
		_topCol("topCol", Color) = (0,1,0,0)
		_windOffset("windOffset", Vector) = (0,0,0,0)
		_bottomCol("bottomCol", Color) = (0,0,0,0)
		_roleMul("roleMul", Range(0 , 10)) = 0
		_roleHOffset("roleHOffset", Range(0 , 10)) = 0
    }
    SubShader
    {
		Tags{"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
		Cull Off

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

			//要使用GPU Instancing必须加上这句
			#pragma multi_compile_instancing
			#include "UnityShaderVariables.cginc"
			#pragma target 3.0
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
				//要使用GPU Instancing必须加上这句
				UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {                
                float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				float3 centerPos : TEXCOORD1;
				float3 worldPos : TEXCOORD2;
				float3 hvVal : TEXCOORD3;
				//要使用GPU Instancing必须加上这句
				UNITY_VERTEX_INPUT_INSTANCE_ID
            };

			uniform float _hmin;
			uniform float _hmax;
			uniform float _vmin;
			uniform float _vmax;
			uniform float _vOffset;
			uniform float2 _windOffset;
			uniform float3 rolePos;
			uniform float _roleMul;
			uniform float _hOffset;
			uniform float _roleHOffset;
			uniform sampler2D _MainTex;
			uniform float4 _MainTex_ST;
			uniform float4 _topCol;
			uniform float4 _bottomCol;
			SamplerState sampler_MainTex;

            v2f vert (appdata v)
            {
                v2f o;
				//要使用GPU Instancing必须加上这句
				UNITY_SETUP_INSTANCE_ID(v);

                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.centerPos = mul(unity_ObjectToWorld, float4(float3(0, 0, 0), 1)).xyz;
				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
				float hVal = smoothstep(_hmin, _hmax, o.worldPos.y - o.centerPos.y);
				float vVal = smoothstep(_vmin, _vmax, distance(o.worldPos.xz, o.centerPos.xz));
				float hvVal = hVal * vVal;
				o.hvVal = float3(hVal, vVal, hvVal);
				float hVertexOffset = hvVal * _hOffset;
				float2 vVertexOffset = (o.worldPos.xz - o.centerPos.xz)*hvVal*_vOffset;
				float2 wind = _windOffset * hVal*_SinTime.w;
				float roleDis = (1 - distance(o.worldPos.xz, rolePos.xz));
				float2 roleNor = (o.worldPos.xz - rolePos.xz)*step(0, roleDis)*(roleDis*_roleMul);
				float2 rolePosXZOffset = vVertexOffset + wind * (1 - roleNor) + roleNor * hVal;
				float rolePosYOffset = hVertexOffset - saturate(roleDis*_roleHOffset);
				o.pos = UnityObjectToClipPos(v.vertex+float3(rolePosXZOffset.x, rolePosYOffset, rolePosXZOffset.y));
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
				//要使用GPU Instancing必须加上这句
				UNITY_SETUP_INSTANCE_ID(i);
                // sample the texture
                half4 col = tex2D(_MainTex, i.uv);
				half3 finalCol = col.rgb * _topCol.rgb*i.hvVal.z + col.rgb;
				finalCol = clamp(finalCol*i.hvVal.x + _bottomCol * (1 - i.hvVal.x)*finalCol,  half3(0, 0, 0), half3(1, 1, 1));
				half alpha = col.a;
				clip(alpha - 0.5);
                return half4(finalCol,alpha);
            }
            ENDCG
        }
		/*
		//为了产生影子,加多一个pass,不过在大量渲染的情况下,不建议加阴影,性能实在差
		Pass {
			Name "ShadowCaster"
			Tags { "LightMode" = "ShadowCaster" }

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"
			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
				//要使用GPU Instancing必须加上这句
				UNITY_VERTEX_INPUT_INSTANCE_ID
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				float3 centerPos : TEXCOORD1;
				float3 worldPos : TEXCOORD2;
				float3 hvVal : TEXCOORD3;
				//要使用GPU Instancing必须加上这句
				UNITY_VERTEX_INPUT_INSTANCE_ID
			};

			uniform float _hmin;
			uniform float _hmax;
			uniform float _vmin;
			uniform float _vmax;
			uniform float _vOffset;
			uniform float2 _windOffset;
			uniform float3 rolePos;
			uniform float _roleMul;
			uniform float _hOffset;
			uniform float _roleHOffset;
			uniform sampler2D _MainTex;
			uniform float4 _MainTex_ST;
			uniform float4 _topCol;
			uniform float4 _bottomCol;
			SamplerState sampler_MainTex;

			v2f vert(appdata v)
			{
				v2f o;
				//要使用GPU Instancing必须加上这句
				UNITY_SETUP_INSTANCE_ID(v);

				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.centerPos = mul(unity_ObjectToWorld, float4(float3(0, 0, 0), 1)).xyz;
				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
				float hVal = smoothstep(_hmin, _hmax, o.worldPos.y - o.centerPos.y);
				float vVal = smoothstep(_vmin, _vmax, distance(o.worldPos.xz, o.centerPos.xz));
				float hvVal = hVal * vVal;
				o.hvVal = float3(hVal, vVal, hvVal);
				float hVertexOffset = hvVal * _hOffset;
				float2 vVertexOffset = (o.worldPos.xz - o.centerPos.xz)*hvVal*_vOffset;
				float2 wind = _windOffset * hVal*_SinTime.w;
				float roleDis = (1 - distance(o.worldPos.xz, rolePos.xz));
				float2 roleNor = (o.worldPos.xz - rolePos.xz)*step(0, roleDis)*(roleDis*_roleMul);
				float2 rolePosXZOffset = vVertexOffset + wind * (1 - roleNor) + roleNor * hVal;
				float rolePosYOffset = hVertexOffset - saturate(roleDis*_roleHOffset);
				o.pos = UnityObjectToClipPos(v.vertex + float3(rolePosXZOffset.x, rolePosYOffset, rolePosXZOffset.y));
				return o;
			}

			half4 frag(v2f i) : SV_Target
			{
				//要使用GPU Instancing必须加上这句
				UNITY_SETUP_INSTANCE_ID(i);
			// sample the texture
			half4 col = tex2D(_MainTex, i.uv);
			clip(col.a - 0.5);
			return col;
		}
			ENDCG

		}
		*/
    }
}
Unity利用GPUinstancing实现大面积草地
Think about me Will, don't worry about me
12-20 1万+
之前用unity自带的terrain画了一片,Draw Call高的要命,自带的根本就没有批合==没法用 帧数低得吓人,Draw Call现在是9000多,有的时候能上万,这。。。开发者根本就没用心做吧。。。 于是决定用GPUinstancing,官方API链接: GPU instancing. 可以自动实例化也可以用Graphics.DrawMeshInstanced 函数来实例化,都必须...
Unity中基于Gpu Instance进行大量物体渲染的实现与分析(一)
热门推荐
leon
06-15 5万+
在3D渲染中,尤其是现代3D游戏中,我希望能够绘制越来越多的场景物体,这对于设备(尤其是移动端)的性能是个极大的考验,对于新一代的渲染api,都逐渐支持了Gpu Instancing技术,这对于大量相同物体的绘制提供了一个新的方案,在最新的unity5中也提供了对gpu instance 的支持,我尝试在unity5中利用gpu instance 技术来表现大量的植被,并对其性能进行了分析,以探索在3D手游中gpu instance的应用的可行性。
Unity】 场景优化策略
发布unity,三维模型的相关内容
11-10 1570
使用GPU Instancing可以将多个网格相同、的物体合并为一个批次,从而减少的次数。这可以提高性能和渲染效率。GPU instancing可用于绘制在场景中多次出现的几何体,例如树木或灌木丛。
Unity Grass Geometry Shader 教程
最新发布
gitblog_00466的博客
08-13 324
Unity Grass Geometry Shader 教程 UnityGrassGeometryShaderSource code for Grass Shader tutorial for Unity. Generates blades with a geometry shader, tessellates input mesh to control density.项目地址:https:/...
利用GPU实现无尽草地的实时渲染
weixin_30894389的博客
09-24 427
0x00 前言 在游戏中展现一个写实的田园场景时,草地渲染是必不可少的,而一提到高效率的渲染草地,很多人都会想起GPU Gems第七章 《Chapter 7. Rendering Countless Blades of Waving Grass》中所提到的方案。 现在国内很多号称“次世代”的手游甚至是一些端游仍或多或少的采用了这种方案。但是本文不会为这个方案着墨过多,相反,接下来的大部分内容是...
Unity大面积草地渲染——1、Shader控制一棵渲染
阿赵的博客
05-07 2568
Unity大面积草地渲染介绍的第一部分:Shader控制一棵渲染
SV_InstanceID/UNITY_VERTEX_INPUT_INSTANCE_ID——GPU instancing
小孔明的专栏
10-21 3144
https://docs.unity3d.com/2019.4/Documentation/Manual/GPUInstancing.html use GPU instancing to draw (or render) multiple copies of the same mesh at once.
UnityGPUInstance详解
Sevol_Y
04-19 4394
为什么要用GPUInstance 在没有GPUInstance此技术之前,对于像草地、树木,割游戏,它们往往是数据量很大,但同时又只存在微小的差别如位置、旋转、颜色等。如果像常规物体那样进行渲染,所使用的绘制指令必然很多,资源占用必然很大,一是cpu对gpu提交数据的次数(包括设置数据buffer,渲染状态以及调用对渲染原语的绘制即drawcall),二是gpu上的绘制(包括顶点处理和像素绘制),随着场景物体的提升,cpu和gpu的压力都会上升。一个合理的策略就是,我们指定一个需要绘制物体对
Unity使用GPU Instancing优化SkinnedMesh渲染
逍遥剑客
07-10 1万+
有这么个需求: 一堆不会动的SkinnedMesh, 通过物理模拟出死亡姿势后, 需要优化性能, 不然才10FPS首先想到的做法是转成StaticMesh. 试了一下直接超出了Unity的顶点Index数量限制, 所以放弃, 再说转换完后也不方便编辑. 另一个思路就是使用Instanced Skinned Mesh Rendering, 找到两个参考:https://github.com/Unit...
(八)unity shader基础之——————渲染平台差异问题
cgy56191948的博客
10-08 2373
unity的优点之一是强大的跨平台性,本篇文章给出了一些常见的因为平台不同而造成的差异。 1.渲染纹理的坐标差异 之前提到过OPenGL和DirectX的屏幕空间坐标的差异。在水平方向上,两者的数值变化方向是相同的,但在竖直方向上,两者是相反的。在OpenGL中,(0,0)点对应了屏幕的左下角,而在DirectX中,(0,0)点对应了左上角。 需要注意的是,我们不仅可以把渲染结果输出到屏...
Unity渲染大量物体DrawMeshInstancedIndirect、Computer shader回调示例
08-24
UnityGPU Instancing GPU Instancing可以用来批量绘制大量相同几何结构相同材质的物体,以降低绘制所需的batches。要想在Unity使用,首先需要至少在shader的某个pass中加上#pragma multi_compile_instancing。 ...
OpenGL ES 学习教程(十七) Unity GPU Instance 原理及 GLES 实现(二)
01-19
OpenGL ES 学习教程(十七) Unity GPU Instance 原理及 GLES 实现(二)
OpenGL ES 学习教程(十七) Unity GPU Instance 原理及 GLES 实现(一)
01-16
OpenGL ES 学习教程(十七) Unity GPU Instance 原理及 GLES 实现(一)
Unity Shader】使用Geometry Shader进行大片草地的实时渲染
weixin_44422550的博客
03-28 4535
效果预览图 0.前言 笔者最近阅读学习了知乎大神@陈嘉栋所写的这篇文章:《利用GPU实现无尽草地的实时渲染》,这篇文章写得非常好,给出了实时生成一片草地的核心思路和基本流程,非常清晰……但可惜的是,如果读者没有一定Shader基础(尤其是关于GeometryShader)的话,在读了这篇文章后很难直接着手去做,许多代码需要自己去下工程来解读。 笔者在下载工程并较为完整地学习/制作,并在此基础上做...
Unity Shader 之GPU Instancing的简单使用
游戏入选者的博客
12-27 5024
GPU Instancing,即GPU实例化,实现方式是将使用同一个材质及网格的物体(需要大批量渲染)的数据一次性打包发给GPU(最常见的运用无非是渲染了…),以达到减少大量DrawCall的目的。其它的我就不啰嗦了,一些细节有必要我会在后面再说。 这次我也只是实现(抄了)了一个比较简单的草地Demo,参考项目是Unity利用GPUinstancing实现大面积草地。下面看一下我自己实现的效果...
unity Gpu Instance
小孔明的专栏
12-25 1803
参考网址: https://blog.csdn.net/leonwei/article/details/73274808 https://docs.unity3d.com/ScriptReference/Graphics.DrawMeshInstancedIndirect.html https://www.cnblogs.com/hont/p/7143626.html
[unity]GPU Instance学习
qq_35037137的博客
05-05 2372
前言 我们之前研究过为什么Unity的UI可以合批,是因为使用了相同的材质进行渲染,UI上不同图片渲染是通过把图片打成一张图集后,使用Image组件对顶点填充了不同的UV值实现的。 那么有没有什么办法可以让3D的物体也像UI一样,使用相同材质,但是可以表现出不一样的样子呢(比如颜色/位置等)? 我们知道unity有两种传统的批处理的方式:静态批处理,动态批处理...
UnityGPU Instancing
异次元的归来
05-13 4184
UnityGPU Instancing GPU Instancing可以用来批量绘制大量相同几何结构相同材质的物体,以降低绘制所需的batches。要想在Unity使用,首先需要至少在shader的某个pass中加上#pragma multi_compile_instancing。由于instancing的每个物体所需要的绘制数据可能各不相同,因此还需要在shader中传递一个instanceId: struct VertexData { UNITY_VERTEX_INPUT_INSTANCE_ID
unity gpu instancing
飞天大蟾蜍的专栏
09-24 2074
Unity gpu instancing unity可以自动合并相同的material对象渲染 将对应shader enable instancing的选项勾上 本文说明一下直接调用unity api的方式,实现合并渲染 参考opengl gl_Instance unity提供了一组api,向gpu批量提交渲染数据 以其中的一个为例Graphics.DrawMeshInstanced 参数为网格数据,shader,以及每个instance的变换矩阵 Material.SetB
unity3d gpu instancing插件下载 csdn
01-09
在CSDN下载Unity3D GPU Instancing插件是非常简单的。首先,打开CSDN官方网站并使用账户登录。然后,在网站的搜索框中键入"Unity3D GPU Instancing插件",然后点击搜索按钮。接下来,您将看到搜索结果页面,上面会列出与您搜索词相关的插件。您可以使用筛选器来进一步缩小搜索范围,以找到您想要的插件。 一旦找到了Unity3D GPU Instancing插件,您可以点击该插件的链接以进入插件页面。在该页面上,您将找到关于插件的详细信息,包括插件的功能、兼容性和下载链接。 点击下载链接将开始插件的下载过程。您可能会被要求选择插件的版本,以确保与您所使用Unity版本兼容。选择适合您的Unity版本的插件版本后,点击下载按钮即可开始下载。 一旦下载完成,您可以在您的计算机上找到插件的安装文件。请确保按照安装说明进行正确的安装。完成安装后,您就可以在Unity编辑器中使用该插件了。 总之,您可以通过在CSDN上搜索并下载Unity3D GPU Instancing插件来为您的Unity项目添加GPU实例化功能。确保遵循正确的下载和安装步骤,以确保插件能够正常工作。
写文章

热门文章

  • 2019年第一次画画,顺便评价一下ipadPro和Surface的画画优劣 34786
  • 面向对象的概念介绍 22125
  • 解决部分手机读取obb失败的问题 17804
  • unity自带寻路Navmesh入门教程(一) 17693
  • MaterialPropertyBlock 17337

分类专栏

  • ZBrush使用 15篇
  • 虚幻引擎(UE) 45篇
  • 系列文章目录 9篇
  • Unity引擎Shader效果 101篇
  • Unity屏幕后处理 10篇
  • TA通用技术 19篇
  • MaxScript 20篇
  • Unity功能与问题解决 47篇
  • Unity资源管理相关 8篇
  • 程序基础 13篇
  • 寻路和智能 9篇
  • 3D打印 22篇
  • 行业杂谈 49篇

最新评论

  • 阿赵UE学习笔记——30、HUD简单介绍

    阿赵3D: 关于UE的暂时只写了2个系列,一个是基础学习笔记,另一个是C++的学习笔记

  • 阿赵UE学习笔记——30、HUD简单介绍

    不想当咸鱼i: 表情包好文,还有后续吗,感觉UE知识点太多了,看官方文档看不懂都表情包

  • Unity引擎在UI上渲染粒子播放

    阿赵3D: 不用导出啊,先理解一下用法,然后shader需要是支持UI的

  • Unity引擎在UI上渲染粒子播放

    TVstart: 导出没效果

  • 关于写简历的趣事

    阿赵3D: 40出头

最新文章

  • FDM3D打印系列——黑悟空打印
  • Unity引擎绘制多边形属性图
  • FDM3D打印系列——大面积水性漆手涂效果测试
2024
09月 10篇
08月 18篇
07月 18篇
06月 16篇
05月 16篇
04月 17篇
03月 19篇
02月 5篇
01月 20篇
2023年151篇
2022年1篇
2020年4篇
2019年5篇
2018年64篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢人物雕塑公司定制商场大厅美陈图片大全江干商场美陈阳信玻璃钢造型雕塑商场走廊顶部美陈河南玻璃钢人物雕塑厂濮阳玻璃钢人物雕塑厂家订制安徽抽象玻璃钢雕塑定制辽宁玻璃钢雕塑企业句容设计玻璃钢雕塑方案南京仿铜玻璃钢雕塑价格淮安玻璃钢人物雕塑价格福建园林玻璃钢雕塑哪家好长沙动物玻璃钢雕塑造型做玻璃钢雕塑视频玻璃钢雕塑怎么喷漆四川玻璃钢大公鸡雕塑昌邑玻璃钢关公雕塑玻璃钢卡通雕塑口碑好周口定制玻璃钢雕塑潞城玻璃钢人物雕塑南阳玻璃钢浮雕学校抽象雕塑清远玻璃钢卡通雕塑公园摆件玻璃钢卡通雕塑销售厂马鞍山定制玻璃钢雕塑多少钱佳木斯玻璃钢雕塑设计主题玻璃钢人物雕塑出厂价格保定玻璃钢彩绘雕塑四川特色商场美陈市场重庆玻璃钢马雕塑定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化