Skip to content

Commit 781f7a7

Browse files
[Rendering] Add Material Apply Mode;
[Rendering] Optimize SkinnedMesh/Mesh rendering;
1 parent 9153029 commit 781f7a7

File tree

4 files changed

+58
-35
lines changed

4 files changed

+58
-35
lines changed

Engine/Core/Rendering/Animation/SkinnedMeshRenderSystem.cs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -280,39 +280,27 @@ public void Submit()
280280
var material = renderer.materials[j];
281281

282282
var needsChange = assetGuid != lastMeshAsset ||
283-
material.Guid != (lastMaterial?.Guid ?? "") ||
284-
lastAnimator != animator;
283+
material.Guid != (lastMaterial?.Guid ?? "");
285284

286-
if(needsChange)
285+
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
286+
287+
if (needsChange)
287288
{
288289
lastMeshAsset = assetGuid;
289290
lastMaterial = material;
290-
lastAnimator = animator;
291291

292292
bgfx.discard((byte)bgfx.DiscardFlags.All);
293293

294294
material.EnableShaderKeyword(Shader.SkinningKeyword);
295295

296-
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
297-
298296
lightSystem?.ApplyMaterialLighting(material, pair.renderer.lighting);
299297

300298
if(material.ShaderProgram.Valid == false)
301299
{
302300
continue;
303301
}
304302

305-
bgfx.set_state((ulong)(state |
306-
renderer.mesh.PrimitiveFlag() |
307-
material.shader.BlendingFlag |
308-
material.CullingFlag), 0);
309-
310-
material.ApplyProperties();
311-
312-
material.shader.SetMatrix4x4(material.GetShaderHandle("u_boneMatrices"), boneMatrices);
313-
314-
lightSystem?.ApplyLightProperties(pair.position, pair.transform, material,
315-
RenderSystem.CurrentCamera.Item2.Position, pair.renderer.lighting);
303+
material.ApplyProperties(Material.ApplyMode.TexturesOnly);
316304
}
317305

318306
unsafe
@@ -324,11 +312,24 @@ public void Submit()
324312

325313
renderer.mesh.SetActive(j);
326314

315+
material.ApplyProperties(Material.ApplyMode.IgnoreTextures);
316+
317+
material.shader.SetMatrix4x4(material.GetShaderHandle("u_boneMatrices"), boneMatrices);
318+
327319
var program = material.ShaderProgram;
328320

321+
bgfx.set_state((ulong)(state |
322+
renderer.mesh.PrimitiveFlag() |
323+
material.shader.BlendingFlag |
324+
material.CullingFlag), 0);
325+
326+
lightSystem?.ApplyLightProperties(pair.position, pair.transform, material,
327+
RenderSystem.CurrentCamera.Item2.Position, pair.renderer.lighting);
328+
329329
var flags = bgfx.DiscardFlags.VertexStreams |
330330
bgfx.DiscardFlags.IndexBuffer |
331-
bgfx.DiscardFlags.Transform;
331+
bgfx.DiscardFlags.Transform |
332+
bgfx.DiscardFlags.State;
332333

333334
bgfx.submit(pair.viewID, program, 0, (byte)flags);
334335
}

Engine/Core/Rendering/Graphics.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static void RenderGeometry(VertexBuffer vertex, IndexBuffer index,
6767
}
6868
else
6969
{
70-
material.ApplyProperties();
70+
material.ApplyProperties(Material.ApplyMode.All);
7171

7272
material.DisableShaderKeyword(Shader.SkinningKeyword);
7373
}
@@ -133,7 +133,7 @@ public static void RenderSimple<T>(Span<T> vertices, VertexLayout layout, ushort
133133
}
134134
else
135135
{
136-
material.ApplyProperties();
136+
material.ApplyProperties(Material.ApplyMode.All);
137137

138138
material.DisableShaderKeyword(Shader.SkinningKeyword);
139139
}

Engine/Core/Rendering/Material.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ public override string ToString()
6161
}
6262
}
6363

64+
internal enum ApplyMode
65+
{
66+
IgnoreTextures,
67+
TexturesOnly,
68+
All,
69+
}
70+
6471
internal const string MainColorProperty = "mainColor";
6572
internal const string MainTextureProperty = "mainTexture";
6673

@@ -618,7 +625,8 @@ internal ShaderHandle GetShaderHandle(string name)
618625
/// <summary>
619626
/// Applies the default properties of this material to the shader
620627
/// </summary>
621-
internal void ApplyProperties()
628+
/// <param name="applyMode">How to apply the properties</param>
629+
internal void ApplyProperties(ApplyMode applyMode)
622630
{
623631
if(shader == null)
624632
{
@@ -650,12 +658,23 @@ internal void ApplyProperties()
650658

651659
foreach (var parameter in parameters.Values)
652660
{
661+
if((applyMode == ApplyMode.IgnoreTextures && parameter.type == MaterialParameterType.Texture) ||
662+
(applyMode == ApplyMode.TexturesOnly && parameter.type != MaterialParameterType.Texture))
663+
{
664+
continue;
665+
}
666+
653667
var key = parameter.name;
654668

655669
switch (parameter.type)
656670
{
657671
case MaterialParameterType.Texture:
658672

673+
if(applyMode == ApplyMode.IgnoreTextures)
674+
{
675+
continue;
676+
}
677+
659678
applyPropertiesCallbacks[counter++] = () =>
660679
{
661680
if (parameter.hasTexture == false)

Engine/Core/Rendering/Mesh/MeshRenderSystem.cs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public static void RenderMesh(Mesh mesh, Vector3 position, Quaternion rotation,
8686

8787
bgfx.set_state((ulong)state, 0);
8888

89-
material.ApplyProperties();
89+
material.ApplyProperties(Material.ApplyMode.All);
9090

9191
mesh.SetActive();
9292

@@ -226,32 +226,24 @@ void DrawMesh(int index)
226226

227227
var needsChange = lastMaterial?.Guid.GetHashCode() != material?.Guid?.GetHashCode();
228228

229-
if(needsChange)
229+
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
230+
231+
if (needsChange)
230232
{
231233
bgfx.discard((byte)bgfx.DiscardFlags.All);
232234

233235
lastMaterial = material;
234236

235237
material.DisableShaderKeyword(Shader.SkinningKeyword);
236238

237-
var lightSystem = RenderSystem.Instance.Get<LightSystem>();
238-
239239
lightSystem?.ApplyMaterialLighting(material, pair.renderer.lighting);
240240

241241
if(material.ShaderProgram.Valid == false)
242242
{
243243
return;
244244
}
245245

246-
bgfx.set_state((ulong)(state |
247-
pair.renderer.mesh.PrimitiveFlag() |
248-
material.shader.BlendingFlag |
249-
material.CullingFlag), 0);
250-
251-
material.ApplyProperties();
252-
253-
lightSystem?.ApplyLightProperties(pair.position, pair.transform, material,
254-
RenderSystem.CurrentCamera.Item2.Position, pair.renderer.lighting);
246+
material.ApplyProperties(Material.ApplyMode.TexturesOnly);
255247
}
256248

257249
unsafe
@@ -263,11 +255,22 @@ void DrawMesh(int index)
263255

264256
pair.renderer.mesh.SetActive(index);
265257

258+
bgfx.set_state((ulong)(state |
259+
pair.renderer.mesh.PrimitiveFlag() |
260+
material.shader.BlendingFlag |
261+
material.CullingFlag), 0);
262+
263+
material.ApplyProperties(Material.ApplyMode.IgnoreTextures);
264+
265+
lightSystem?.ApplyLightProperties(pair.position, pair.transform, material,
266+
RenderSystem.CurrentCamera.Item2.Position, pair.renderer.lighting);
267+
266268
var program = material.ShaderProgram;
267269

268270
var flags = bgfx.DiscardFlags.VertexStreams |
269271
bgfx.DiscardFlags.IndexBuffer |
270-
bgfx.DiscardFlags.Transform;
272+
bgfx.DiscardFlags.Transform |
273+
bgfx.DiscardFlags.State;
271274

272275
bgfx.submit(pair.viewID, program, 0, (byte)flags);
273276
}

0 commit comments

Comments
 (0)