From 1a0106a915c0b605158a21653dfa1782781b230a Mon Sep 17 00:00:00 2001 From: singlecoder Date: Tue, 29 Jun 2021 17:05:40 +0800 Subject: [PATCH 1/6] refactor(2d): sprite material add define USE_MODEL_MATRIX --- packages/core/src/2d/sprite/SpriteMaterial.ts | 41 ------------------- packages/core/src/2d/sprite/SpriteRenderer.ts | 1 + .../core/src/RenderPipeline/SpriteBatcher.ts | 10 ++++- .../core/src/shaderlib/extra/sprite.vs.glsl | 9 ++++ 4 files changed, 18 insertions(+), 43 deletions(-) delete mode 100644 packages/core/src/2d/sprite/SpriteMaterial.ts diff --git a/packages/core/src/2d/sprite/SpriteMaterial.ts b/packages/core/src/2d/sprite/SpriteMaterial.ts deleted file mode 100644 index 177aaca499..0000000000 --- a/packages/core/src/2d/sprite/SpriteMaterial.ts +++ /dev/null @@ -1,41 +0,0 @@ -"use strict"; - -import { Shader } from "../../shader"; - -const spriteVertShader = ` -precision highp float; - -uniform mat4 u_VPMat; - -attribute vec3 POSITION; -attribute vec2 TEXCOORD_0; -attribute vec4 COLOR_0; - -varying vec2 v_uv; -varying vec4 v_color; - -void main() -{ - gl_Position = u_VPMat * vec4(POSITION, 1.0); - v_uv = TEXCOORD_0; - v_color = COLOR_0; -} -`; - -const spriteFragmentShader = ` -precision mediump float; -precision mediump int; - -uniform sampler2D u_spriteTexture; -varying vec2 v_uv; -varying vec4 v_color; - -void main() -{ - // Only use the Alpha of the texture as a mask, so that the tint color can still be controlled to fade out. - vec4 baseColor = texture2D(u_spriteTexture, v_uv); - gl_FragColor = baseColor * v_color; -} -`; - -Shader.create("Sprite", spriteVertShader, spriteFragmentShader); diff --git a/packages/core/src/2d/sprite/SpriteRenderer.ts b/packages/core/src/2d/sprite/SpriteRenderer.ts index 52c691b01c..1a2ed1f9e6 100644 --- a/packages/core/src/2d/sprite/SpriteRenderer.ts +++ b/packages/core/src/2d/sprite/SpriteRenderer.ts @@ -128,6 +128,7 @@ export class SpriteRenderer extends Renderer { super(entity); this._isWorldMatrixDirty = entity.transform.registerWorldChangeFlag(); this.setMaterial(this._engine._spriteDefaultMaterial); + this.shaderData.disableMacro("USE_MODEL_MATRIX"); } /** diff --git a/packages/core/src/RenderPipeline/SpriteBatcher.ts b/packages/core/src/RenderPipeline/SpriteBatcher.ts index 453b1fb394..828ecc8657 100644 --- a/packages/core/src/RenderPipeline/SpriteBatcher.ts +++ b/packages/core/src/RenderPipeline/SpriteBatcher.ts @@ -4,6 +4,7 @@ import { Engine } from "../Engine"; import { VertexElementFormat } from "../graphic/enums/VertexElementFormat"; import { VertexElement } from "../graphic/VertexElement"; import { Shader } from "../shader/Shader"; +import { ShaderMacroCollection } from "../shader/ShaderMacroCollection"; import { ShaderProperty } from "../shader/ShaderProperty"; import { Basic2DBatcher } from "./Basic2DBatcher"; import { SpriteElement } from "./SpriteElement"; @@ -89,12 +90,17 @@ export class SpriteBatcher extends Basic2DBatcher { const renderer = spriteElement.component; const camera = spriteElement.camera; + const material = spriteElement.material; maskManager.preRender(camera, renderer); const compileMacros = Shader._compileMacros; - compileMacros.clear(); + // union render global macro and material self macro. + ShaderMacroCollection.unionCollection( + renderer._globalShaderMacro, + material.shaderData._macroCollection, + compileMacros + ); - const material = spriteElement.material; const program = material.shader._getShaderProgram(engine, compileMacros); if (!program.isValid) { return; diff --git a/packages/core/src/shaderlib/extra/sprite.vs.glsl b/packages/core/src/shaderlib/extra/sprite.vs.glsl index ab0081edf7..1782533aa3 100644 --- a/packages/core/src/shaderlib/extra/sprite.vs.glsl +++ b/packages/core/src/shaderlib/extra/sprite.vs.glsl @@ -1,6 +1,10 @@ precision highp float; +#ifdef USE_MODEL_MATRIX +uniform mat4 u_MVPMat; +#else uniform mat4 u_VPMat; +#endif attribute vec3 POSITION; attribute vec2 TEXCOORD_0; @@ -11,7 +15,12 @@ varying vec4 v_color; void main() { + #ifdef USE_MODEL_MATRIX + gl_Position = u_MVPMat * vec4(POSITION, 1.0); + #else gl_Position = u_VPMat * vec4(POSITION, 1.0); + #endif + v_uv = TEXCOORD_0; v_color = COLOR_0; } \ No newline at end of file From 3873a3d03e32779bde66027cd89c4d0a824f8ee9 Mon Sep 17 00:00:00 2001 From: singlecoder Date: Tue, 29 Jun 2021 17:51:38 +0800 Subject: [PATCH 2/6] refactor(2d): opt code --- packages/core/src/2d/sprite/SpriteRenderer.ts | 1 - .../core/src/RenderPipeline/SpriteMaskBatcher.ts | 13 ++++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/core/src/2d/sprite/SpriteRenderer.ts b/packages/core/src/2d/sprite/SpriteRenderer.ts index 1a2ed1f9e6..52c691b01c 100644 --- a/packages/core/src/2d/sprite/SpriteRenderer.ts +++ b/packages/core/src/2d/sprite/SpriteRenderer.ts @@ -128,7 +128,6 @@ export class SpriteRenderer extends Renderer { super(entity); this._isWorldMatrixDirty = entity.transform.registerWorldChangeFlag(); this.setMaterial(this._engine._spriteDefaultMaterial); - this.shaderData.disableMacro("USE_MODEL_MATRIX"); } /** diff --git a/packages/core/src/RenderPipeline/SpriteMaskBatcher.ts b/packages/core/src/RenderPipeline/SpriteMaskBatcher.ts index dad4df0881..2c95387d82 100644 --- a/packages/core/src/RenderPipeline/SpriteMaskBatcher.ts +++ b/packages/core/src/RenderPipeline/SpriteMaskBatcher.ts @@ -4,6 +4,7 @@ import { VertexElementFormat } from "../graphic/enums/VertexElementFormat"; import { VertexElement } from "../graphic/VertexElement"; import { StencilOperation } from "../shader/enums/StencilOperation"; import { Shader } from "../shader/Shader"; +import { ShaderMacroCollection } from "../shader/ShaderMacroCollection"; import { Basic2DBatcher } from "./Basic2DBatcher"; import { SpriteMaskElement } from "./SpriteMaskElement"; @@ -61,10 +62,17 @@ export class SpriteMaskBatcher extends Basic2DBatcher { return; } + const renderer = spriteMaskElement.component; + const material = spriteMaskElement.material; + const compileMacros = Shader._compileMacros; - compileMacros.clear(); + // union render global macro and material self macro. + ShaderMacroCollection.unionCollection( + renderer._globalShaderMacro, + material.shaderData._macroCollection, + compileMacros + ); - const material = spriteMaskElement.material; // Update stencil state const stencilState = material.renderState.stencilState; const op = spriteMaskElement.isAdd ? StencilOperation.IncrementSaturate : StencilOperation.DecrementSaturate; @@ -77,7 +85,6 @@ export class SpriteMaskBatcher extends Basic2DBatcher { } const camera = spriteMaskElement.camera; - const renderer = spriteMaskElement.component; program.bind(); program.groupingOtherUniformBlock(); From 3741688b33c11e477a4cd6ad770ed4e80f32c118 Mon Sep 17 00:00:00 2001 From: singlecoder Date: Tue, 24 Aug 2021 19:33:13 +0800 Subject: [PATCH 3/6] fix: fix 2d renderer error --- packages/core/src/ComponentsManager.ts | 6 +++- .../core/src/RenderPipeline/RenderQueue.ts | 28 ++++++++++++++++--- packages/core/src/Renderer.ts | 8 ++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/packages/core/src/ComponentsManager.ts b/packages/core/src/ComponentsManager.ts index d62fe77a41..aa63fd9446 100644 --- a/packages/core/src/ComponentsManager.ts +++ b/packages/core/src/ComponentsManager.ts @@ -181,7 +181,11 @@ export class ComponentsManager { Vector3.subtract(center, position, center); element._distanceForSort = Vector3.dot(center, forward); } else { - element._distanceForSort = Vector3.distanceSquared(center, position); + if (element._renderSortId > 0) { + element._distanceForSort = -1; + } else { + element._distanceForSort = Vector3.distanceSquared(center, position); + } } element._updateShaderData(context); diff --git a/packages/core/src/RenderPipeline/RenderQueue.ts b/packages/core/src/RenderPipeline/RenderQueue.ts index b8f09a8144..784aef920c 100644 --- a/packages/core/src/RenderPipeline/RenderQueue.ts +++ b/packages/core/src/RenderPipeline/RenderQueue.ts @@ -19,11 +19,21 @@ export class RenderQueue { */ static _compareFromNearToFar(a: Item, b: Item): number { const renderQueueDif = a.material.renderQueueType - b.material.renderQueueType; - if (renderQueueDif) { return renderQueueDif; } - return a.component._distanceForSort - b.component._distanceForSort; + + const distanceDif = a.component._distanceForSort - b.component._distanceForSort; + if (distanceDif) { + return distanceDif; + } + + const groupIdDif = b.component._renderGroupId - a.component._renderGroupId; + if (groupIdDif) { + return groupIdDif; + } + + return b.component._renderSortId - a.component._renderSortId; } /** @@ -31,11 +41,21 @@ export class RenderQueue { */ static _compareFromFarToNear(a: Item, b: Item): number { const renderQueueDif = a.material.renderQueueType - b.material.renderQueueType; - if (renderQueueDif) { return renderQueueDif; } - return b.component._distanceForSort - a.component._distanceForSort; + + const distanceDif = b.component._distanceForSort - a.component._distanceForSort; + if (distanceDif) { + return distanceDif; + } + + const groupIdDif = b.component._renderGroupId - a.component._renderGroupId; + if (groupIdDif) { + return groupIdDif; + } + + return b.component._renderSortId - a.component._renderSortId; } readonly items: Item[] = []; diff --git a/packages/core/src/Renderer.ts b/packages/core/src/Renderer.ts index 6cb822ff6f..986d86c11d 100644 --- a/packages/core/src/Renderer.ts +++ b/packages/core/src/Renderer.ts @@ -42,6 +42,14 @@ export abstract class Renderer extends Component { @ignoreClone _globalShaderMacro: ShaderMacroCollection = new ShaderMacroCollection(); + /** @internal temp solution. */ + @ignoreClone + _renderGroupId: number = 0; + + /** @internal temp solution. */ + @ignoreClone + _renderSortId: number = 0; + @ignoreClone protected _overrideUpdate: boolean = false; @shallowClone From bf6a3183a8135401830418de21b29163529abbc4 Mon Sep 17 00:00:00 2001 From: singlecoder Date: Tue, 24 Aug 2021 20:28:45 +0800 Subject: [PATCH 4/6] fix: opt code --- packages/core/src/2d/sprite/SpriteRenderer.ts | 26 ++++++++++++++----- packages/core/src/ComponentsManager.ts | 6 +---- .../core/src/RenderPipeline/RenderQueue.ts | 10 ------- packages/core/src/Renderer.ts | 4 --- 4 files changed, 20 insertions(+), 26 deletions(-) diff --git a/packages/core/src/2d/sprite/SpriteRenderer.ts b/packages/core/src/2d/sprite/SpriteRenderer.ts index 52c691b01c..eecc8a1f5c 100644 --- a/packages/core/src/2d/sprite/SpriteRenderer.ts +++ b/packages/core/src/2d/sprite/SpriteRenderer.ts @@ -18,6 +18,13 @@ export class SpriteRenderer extends Renderer { private static _textureProperty: ShaderProperty = Shader.getPropertyByName("u_spriteTexture"); private static _tempVec3: Vector3 = new Vector3(); + /** @internal temp solution. */ + @ignoreClone + _customLocalBounds: BoundingBox = null; + /** @internal temp solution. */ + @ignoreClone + _curtomRootEntity: Entity = null; + @deepClone private _positions: Vector3[] = [new Vector3(), new Vector3(), new Vector3(), new Vector3()]; @assignmentClone @@ -230,14 +237,19 @@ export class SpriteRenderer extends Renderer { */ protected _updateBounds(worldBounds: BoundingBox): void { const sprite = this._sprite; - if (sprite) { - const localBounds = sprite.bounds; - const worldMatrix = this._entity.transform.worldMatrix; - BoundingBox.transform(localBounds, worldMatrix, worldBounds); + if (this._customLocalBounds && this._curtomRootEntity) { + const worldMatrix = this._curtomRootEntity.transform.worldMatrix; + BoundingBox.transform(this._customLocalBounds, worldMatrix, worldBounds); } else { - worldBounds.min.setValue(0, 0, 0); - worldBounds.max.setValue(0, 0, 0); - } + if (sprite) { + const localBounds = sprite.bounds; + const worldMatrix = this._entity.transform.worldMatrix; + BoundingBox.transform(localBounds, worldMatrix, worldBounds); + } else { + worldBounds.min.setValue(0, 0, 0); + worldBounds.max.setValue(0, 0, 0); + } + } } private _updateStencilState(): void { diff --git a/packages/core/src/ComponentsManager.ts b/packages/core/src/ComponentsManager.ts index aa63fd9446..d62fe77a41 100644 --- a/packages/core/src/ComponentsManager.ts +++ b/packages/core/src/ComponentsManager.ts @@ -181,11 +181,7 @@ export class ComponentsManager { Vector3.subtract(center, position, center); element._distanceForSort = Vector3.dot(center, forward); } else { - if (element._renderSortId > 0) { - element._distanceForSort = -1; - } else { - element._distanceForSort = Vector3.distanceSquared(center, position); - } + element._distanceForSort = Vector3.distanceSquared(center, position); } element._updateShaderData(context); diff --git a/packages/core/src/RenderPipeline/RenderQueue.ts b/packages/core/src/RenderPipeline/RenderQueue.ts index 784aef920c..4c1d3b62c2 100644 --- a/packages/core/src/RenderPipeline/RenderQueue.ts +++ b/packages/core/src/RenderPipeline/RenderQueue.ts @@ -28,11 +28,6 @@ export class RenderQueue { return distanceDif; } - const groupIdDif = b.component._renderGroupId - a.component._renderGroupId; - if (groupIdDif) { - return groupIdDif; - } - return b.component._renderSortId - a.component._renderSortId; } @@ -50,11 +45,6 @@ export class RenderQueue { return distanceDif; } - const groupIdDif = b.component._renderGroupId - a.component._renderGroupId; - if (groupIdDif) { - return groupIdDif; - } - return b.component._renderSortId - a.component._renderSortId; } diff --git a/packages/core/src/Renderer.ts b/packages/core/src/Renderer.ts index 986d86c11d..8bebdd95b9 100644 --- a/packages/core/src/Renderer.ts +++ b/packages/core/src/Renderer.ts @@ -42,10 +42,6 @@ export abstract class Renderer extends Component { @ignoreClone _globalShaderMacro: ShaderMacroCollection = new ShaderMacroCollection(); - /** @internal temp solution. */ - @ignoreClone - _renderGroupId: number = 0; - /** @internal temp solution. */ @ignoreClone _renderSortId: number = 0; From 1114e44e2f3ee69f0f65487bc7f415a454bbdd0a Mon Sep 17 00:00:00 2001 From: singlecoder Date: Tue, 24 Aug 2021 20:55:49 +0800 Subject: [PATCH 5/6] fix: opt code --- packages/core/src/2d/sprite/SpriteRenderer.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/core/src/2d/sprite/SpriteRenderer.ts b/packages/core/src/2d/sprite/SpriteRenderer.ts index eecc8a1f5c..0627973b43 100644 --- a/packages/core/src/2d/sprite/SpriteRenderer.ts +++ b/packages/core/src/2d/sprite/SpriteRenderer.ts @@ -237,19 +237,19 @@ export class SpriteRenderer extends Renderer { */ protected _updateBounds(worldBounds: BoundingBox): void { const sprite = this._sprite; - if (this._customLocalBounds && this._curtomRootEntity) { - const worldMatrix = this._curtomRootEntity.transform.worldMatrix; - BoundingBox.transform(this._customLocalBounds, worldMatrix, worldBounds); - } else { - if (sprite) { + if (sprite) { + if (this._customLocalBounds && this._curtomRootEntity) { + const worldMatrix = this._curtomRootEntity.transform.worldMatrix; + BoundingBox.transform(this._customLocalBounds, worldMatrix, worldBounds); + } else { const localBounds = sprite.bounds; const worldMatrix = this._entity.transform.worldMatrix; BoundingBox.transform(localBounds, worldMatrix, worldBounds); - } else { - worldBounds.min.setValue(0, 0, 0); - worldBounds.max.setValue(0, 0, 0); } - } + } else { + worldBounds.min.setValue(0, 0, 0); + worldBounds.max.setValue(0, 0, 0); + } } private _updateStencilState(): void { From 1509f239c2f3eed35b63ee0eae135b23f89d476b Mon Sep 17 00:00:00 2001 From: singlecoder Date: Tue, 24 Aug 2021 21:09:15 +0800 Subject: [PATCH 6/6] fix: opt code --- packages/core/src/2d/sprite/SpriteRenderer.ts | 6 ++-- .../core/src/RenderPipeline/RenderQueue.ts | 32 ++++++------------- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/packages/core/src/2d/sprite/SpriteRenderer.ts b/packages/core/src/2d/sprite/SpriteRenderer.ts index 0627973b43..045c1672f1 100644 --- a/packages/core/src/2d/sprite/SpriteRenderer.ts +++ b/packages/core/src/2d/sprite/SpriteRenderer.ts @@ -23,7 +23,7 @@ export class SpriteRenderer extends Renderer { _customLocalBounds: BoundingBox = null; /** @internal temp solution. */ @ignoreClone - _curtomRootEntity: Entity = null; + _customRootEntity: Entity = null; @deepClone private _positions: Vector3[] = [new Vector3(), new Vector3(), new Vector3(), new Vector3()]; @@ -238,8 +238,8 @@ export class SpriteRenderer extends Renderer { protected _updateBounds(worldBounds: BoundingBox): void { const sprite = this._sprite; if (sprite) { - if (this._customLocalBounds && this._curtomRootEntity) { - const worldMatrix = this._curtomRootEntity.transform.worldMatrix; + if (this._customLocalBounds && this._customRootEntity) { + const worldMatrix = this._customRootEntity.transform.worldMatrix; BoundingBox.transform(this._customLocalBounds, worldMatrix, worldBounds); } else { const localBounds = sprite.bounds; diff --git a/packages/core/src/RenderPipeline/RenderQueue.ts b/packages/core/src/RenderPipeline/RenderQueue.ts index 4c1d3b62c2..f07ac02cbd 100644 --- a/packages/core/src/RenderPipeline/RenderQueue.ts +++ b/packages/core/src/RenderPipeline/RenderQueue.ts @@ -18,34 +18,22 @@ export class RenderQueue { * @internal */ static _compareFromNearToFar(a: Item, b: Item): number { - const renderQueueDif = a.material.renderQueueType - b.material.renderQueueType; - if (renderQueueDif) { - return renderQueueDif; - } - - const distanceDif = a.component._distanceForSort - b.component._distanceForSort; - if (distanceDif) { - return distanceDif; - } - - return b.component._renderSortId - a.component._renderSortId; + return ( + a.material.renderQueueType - b.material.renderQueueType || + a.component._distanceForSort - b.component._distanceForSort || + b.component._renderSortId - a.component._renderSortId + ); } /** * @internal */ static _compareFromFarToNear(a: Item, b: Item): number { - const renderQueueDif = a.material.renderQueueType - b.material.renderQueueType; - if (renderQueueDif) { - return renderQueueDif; - } - - const distanceDif = b.component._distanceForSort - a.component._distanceForSort; - if (distanceDif) { - return distanceDif; - } - - return b.component._renderSortId - a.component._renderSortId; + return ( + a.material.renderQueueType - b.material.renderQueueType || + b.component._distanceForSort - a.component._distanceForSort || + b.component._renderSortId - a.component._renderSortId + ); } readonly items: Item[] = [];