Unleash Your Gpu Instancing

Unleash Your Gpu Instancing

how does GPU instancing work?

In short:

  1. Send the mesh data to GPU (triangles, vertices, indices, etc.).
  2. Send to GPU a list of properties per instance (position, scale, rotation, etc.)
  3. Draw mesh x times at once, where x is the number of instances.

What you actually have to do in Unity:

  1. Create a shader with support for GPU instancing and use it in the mesh’s material (don’t forget to enable it).
  2. Add instances of your mesh into the scene.
  3. (Optional) Create a script to setup different material properties per instance.

Pros and Cons

Pros:

  1. You’re sending less data to GPU.
  2. Your mesh is not limited by 900 vertex attributes.
  3. Despite being the same mesh, you can have some variety by playing with the material properties.

Cons:

  1. No lightmap (do not forget to disable lightmap static).
  2. Always the same mesh.
  3. You have to create scripts to setup different material properties.

Of course there are more pros and cons, but I’m not going deep here.

 

Shader "Unlit/TextureInstancing"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_TextureCellDim ("Texture Cell and Dimension", Vector) = (0,0,0,0)
		_TextureST ("Texture ST", Vector) = (1,1,0,0)
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			Tags { "LightMode" = "ForwardBase"}

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			// Enable gpu instancing variants.
			#pragma multi_compile_instancing

			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float2 uv : TEXCOORD01;
				UNITY_VERTEX_INPUT_INSTANCE_ID // Need this for basic functionality.
			};

			struct v2f
			{
				float4 vertex : SV_POSITION;
				float2 uv : TEXCOORD01;
				float3 normal : TEXCOORD02;
				float3 worldPos : TEXCOORD03;
				UNITY_VERTEX_INPUT_INSTANCE_ID // Need this to be able to get property in fragment shader.				
			};

			// Per instance properties must be declared in this block.
			UNITY_INSTANCING_BUFFER_START(Props)
                UNITY_DEFINE_INSTANCED_PROP(float4, _TextureCellDim)
                UNITY_DEFINE_INSTANCED_PROP(float4, _TextureST)
            UNITY_INSTANCING_BUFFER_END(Props)

			sampler2D _MainTex; float4 _MainTex_ST;

			v2f vert (appdata v)
			{
				v2f o;

				// Setup.
				UNITY_SETUP_INSTANCE_ID(v);
				// Transfer to fragment shader.
				UNITY_TRANSFER_INSTANCE_ID(v, o);

				o.normal = UnityObjectToWorldNormal(v.normal);
				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				// Setup.
				UNITY_SETUP_INSTANCE_ID(i);

				float3 normalDir = normalize(i.normal);
				float3 lightDir = _WorldSpaceLightPos0;
				// Simple light interaction.
				float3 diffuse = clamp(dot(normalDir, lightDir), 0.5, 1);
				
				// Get per instance property values.
				float4 texCellDim = UNITY_ACCESS_INSTANCED_PROP(Props, _TextureCellDim);
				float4 texST = UNITY_ACCESS_INSTANCED_PROP(Props, _TextureST);
				
				// Apply tiling and offset, and compute uv for cell specified. 
				float2 uv = (texCellDim.xy + frac(i.uv * texST.xy + texST.zw))/texCellDim.zw; 
				
				fixed3 texColor = tex2D(_MainTex, uv);

				return fixed4(texColor * diffuse, 1);
			}
			ENDCG
		}
	}
}

 

### 回答1: Delphi GUI编程与FireMonkey:释放FM的全部潜能 Delphi是一种强大的编程语言和集成开发环境,而FireMonkey是其GUI框架的一部分。FireMonkey是一种跨平台的GUI框架,它允许开发人员创建适用于各种操作系统的用户界面。 使用FireMonkey,我们可以充分发挥FM的全部潜能。首先,FM支持多平台开发,这意味着我们只需编写一次代码,即可将我们的应用程序运行在多个操作系统上,如Windows、macOS、iOS和Android。这对于开发人员来说是非常方便和高效的,因为他们不需要为每个平台单独编写代码。 其次,FM提供了丰富的GUI控件和功能,用于创建各种用户界面。它包括按钮、文本框、列表框、滑块等常见的控件,以及图表、动画、3D渲染等增强功能。这些控件和功能可以让我们的应用程序具有更多的交互性和吸引力,满足用户对美观和易用性的需求。 此外,FM还提供了强大的绘图和渲染功能,可以实现高效的图形处理和动画效果。它支持矢量图形、位图和OpenGL渲染,使我们能够创建出色的视觉效果,并实现流畅的界面操作。 最后,FM还具有强大的数据绑定和响应式编程功能。我们可以将应用程序的数据模型与界面元素进行绑定,实现数据的自动更新和同步。这使得我们的应用程序能够快速响应用户的操作,并提供实时数据展示和交互。 总而言之,Delphi GUI编程与FireMonkey可以让开发人员充分发挥FM的全部潜能。它的跨平台能力、丰富的控件和功能、强大的绘图和渲染、以及数据绑定和响应式编程能力,使我们能够创建出色的GUI应用程序,满足用户的需求和期望。无论是桌面应用程序还是移动应用程序,Delphi和FireMonkey都是一个强大的选择。 ### 回答2: FireMonkey是Delphi的GUI开发框架,它能释放出FM(FireMonkey)的全部潜能,让开发者可以创建出更加丰富、灵活和吸引人的应用程序。 使用FireMonkey进行GUI编程,可以实现跨平台开发。FireMonkey支持Windows、macOS、iOS和Android等多个平台,开发者只需要编写一次代码,就可以在不同平台上运行应用程序。这大大节约了开发时间和工作量。无论你是为桌面还是移动设备开发应用程序,FireMonkey都能帮助你快速有效地完成任务。 FireMonkey提供了丰富的GUI组件库,可以创建各种界面元素,如按钮、文本框、列表框等。这些组件可以自定义样式和外观,使应用程序具有独特的风格和品味。FireMonkey还支持多点触摸和手势操作,可以让用户在触摸设备上更自由地进行交互。 另外,FireMonkey还提供了强大的绘图和动画功能。开发者可以利用FireMonkey的绘图引擎创建出精美的图形和动画效果。这些效果可以增强用户体验,使应用程序更加生动和具有吸引力。 FireMonkey还支持数据绑定和数据库连接,可以轻松地与数据库进行交互。开发者可以利用FireMonkey的数据绑定功能将界面元素与数据源进行绑定,实现数据的显示和更新。这使得开发和管理数据库应用程序变得更加简单和高效。 总之,Delphi GUI编程与FireMonkey的结合能够充分发挥FireMonkey的潜能,让开发者可以快速构建跨平台、丰富多样的应用程序,提高开发效率并提升用户体验。 ### 回答3: Delphi是一种用于创建GUI应用程序的编程语言,它采用了FireMonkey框架来实现跨平台的用户界面设计。FireMonkey是Embarcadero Technologies开发的一种强大的GUI框架,可以让开发人员充分发挥FM的潜力。 FireMonkey不仅可以在不同操作系统上运行,还具有丰富的界面控件和可定制性。使用FireMonkey,开发人员可以快速创建漂亮、直观的用户界面,无论是在桌面还是移动设备上。FireMonkey还支持多种触摸手势和动画效果,使应用程序在用户界面上更具交互性和吸引力。 FireMonkey还提供了强大的图形处理功能,包括2D和3D绘图、图像处理和多媒体支持。它还集成了先进的图形渲染引擎,可以实现高性能的图形效果。通过FireMonkey,开发人员可以创建出色的图表、数据可视化和游戏应用程序。 另外,FireMonkey还具有可扩展性和可定制性。开发人员可以通过使用Delphi的强大功能扩展和自定义FireMonkey的特性。这使得开发人员能够根据自己的需求进行广泛的定制,以实现创新和独特的用户界面设计。 总的来说,Delphi GUI编程与FireMonkey的结合可以充分释放FM的全部潜力。开发人员可以通过使用FireMonkey来创建功能强大、界面美观的应用程序,并实现跨平台的部署。FireMonkey不仅提供了丰富的界面控件和图形处理功能,还具有可扩展性和定制性,使开发人员能够灵活地创造出独特的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值