Skip to content

Commit 9146e1a

Browse files
authored
Opt and fix code (#11)
* refactor: opt code
1 parent ccf12b8 commit 9146e1a

File tree

10 files changed

+100
-73
lines changed

10 files changed

+100
-73
lines changed

packages/core/src/RenderPipeline/BasicRenderPipeline.ts

+17-2
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,17 @@ export class BasicRenderPipeline {
237237

238238
let renderQueueAddedFlags = RenderQueueAddedFlag.None;
239239
for (let i = 0, n = shaderPasses.length; i < n; i++) {
240-
const renderQueueType = (shaderPasses[i]._renderState ?? renderStates[i]).renderQueueType;
240+
// Get render queue type
241+
let renderQueueType: RenderQueueType;
242+
const shaderPass = shaderPasses[i];
243+
const renderState = shaderPass._renderState;
244+
if (renderState) {
245+
renderState._applyRenderQueueByShaderData(shaderPass._renderStateDataMap, element.material.shaderData);
246+
renderQueueType = renderState.renderQueueType;
247+
} else {
248+
renderQueueType = renderStates[i].renderQueueType;
249+
}
250+
241251
if (renderQueueAddedFlags & (<RenderQueueAddedFlag>(1 << renderQueueType))) {
242252
continue;
243253
}
@@ -280,7 +290,12 @@ export class BasicRenderPipeline {
280290
program.uploadAll(program.materialUniformBlock, material.shaderData);
281291
program.uploadUnGroupTextures();
282292

283-
(pass._renderState || material.renderState)._apply(engine, false, pass._renderStateDataMap, material.shaderData);
293+
(pass._renderState || material.renderState)._applyStates(
294+
engine,
295+
false,
296+
pass._renderStateDataMap,
297+
material.shaderData
298+
);
284299
rhi.drawPrimitive(mesh._primitive, mesh.subMesh, program);
285300
}
286301

packages/core/src/RenderPipeline/PipelineUtils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export class PipelineUtils {
147147
program.uploadAll(program.materialUniformBlock, blitMaterial.shaderData);
148148
program.uploadUnGroupTextures();
149149

150-
(pass._renderState || blitMaterial.renderState)._apply(
150+
(pass._renderState || blitMaterial.renderState)._applyStates(
151151
engine,
152152
false,
153153
pass._renderStateDataMap,

packages/core/src/RenderPipeline/RenderQueue.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export class RenderQueue {
179179
}
180180

181181
const renderState = shaderPass._renderState ?? renderStates[j];
182-
renderState._apply(
182+
renderState._applyStates(
183183
engine,
184184
renderer.entity.transform._isFrontFaceInvert(),
185185
shaderPass._renderStateDataMap,

packages/core/src/RenderPipeline/SpriteBatcher.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,12 @@ export class SpriteBatcher extends Basic2DBatcher {
125125
program.uploadAll(program.rendererUniformBlock, renderer.shaderData);
126126
program.uploadAll(program.materialUniformBlock, material.shaderData);
127127

128-
(pass._renderState || material.renderState)._apply(engine, false, pass._renderStateDataMap, material.shaderData);
128+
(pass._renderState || material.renderState)._applyStates(
129+
engine,
130+
false,
131+
pass._renderStateDataMap,
132+
material.shaderData
133+
);
129134
engine._hardwareRenderer.drawPrimitive(primitive, subMesh, program);
130135

131136
maskManager.postRender(renderer);

packages/core/src/RenderPipeline/SpriteMaskBatcher.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,12 @@ export class SpriteMaskBatcher extends Basic2DBatcher {
9797
program.uploadAll(program.rendererUniformBlock, renderer.shaderData);
9898
program.uploadAll(program.materialUniformBlock, material.shaderData);
9999

100-
(pass._renderState || material.renderState)._apply(engine, false, pass._renderStateDataMap, material.shaderData);
100+
(pass._renderState || material.renderState)._applyStates(
101+
engine,
102+
false,
103+
pass._renderStateDataMap,
104+
material.shaderData
105+
);
101106

102107
engine._hardwareRenderer.drawPrimitive(primitive, subMesh, program);
103108
}

packages/core/src/Scene.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,10 @@ export class Scene extends EngineObject {
249249
return this._enableTransparentShadow;
250250
}
251251

252-
set enableTransparentShadow(v: boolean) {
253-
if (v !== this._enableTransparentShadow) {
254-
this._enableTransparentShadow = v;
255-
if (v) {
252+
set enableTransparentShadow(value: boolean) {
253+
if (value !== this._enableTransparentShadow) {
254+
this._enableTransparentShadow = value;
255+
if (value) {
256256
this.shaderData.enableMacro("SCENE_ENABLE_TRANSPARENT_SHADOW");
257257
} else {
258258
this.shaderData.disableMacro("SCENE_ENABLE_TRANSPARENT_SHADOW");

packages/core/src/material/BaseMaterial.ts

+36-44
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Engine } from "../Engine";
2-
import { BlendFactor, BlendOperation, CullMode, Shader, ShaderPass, ShaderProperty } from "../shader";
2+
import { BlendFactor, BlendOperation, CullMode, Shader, ShaderProperty } from "../shader";
33
import { RenderQueueType } from "../shader/enums/RenderQueueType";
44
import { ShaderMacro } from "../shader/ShaderMacro";
55
import { RenderState } from "../shader/state/RenderState";
@@ -8,6 +8,9 @@ import { RenderFace } from "./enums/RenderFace";
88
import { Material } from "./Material";
99

1010
export class BaseMaterial extends Material {
11+
/** @internal */
12+
static _shadowCasterRenderQueueProp = ShaderProperty.getByName("material_ShadowCasterRenderQueue");
13+
1114
protected static _baseTextureMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_BASETEXTURE");
1215
protected static _normalTextureMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_NORMALTEXTURE");
1316
protected static _emissiveTextureMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_EMISSIVETEXTURE");
@@ -27,8 +30,6 @@ export class BaseMaterial extends Material {
2730
private _renderFace: RenderFace = RenderFace.Front;
2831
private _isTransparent: boolean = false;
2932
private _blendMode: BlendMode = BlendMode.Normal;
30-
private _shadowPass: ShaderPass;
31-
private _shadowPassIndex: number;
3233

3334
/**
3435
* Shader used by the material.
@@ -62,21 +63,33 @@ export class BaseMaterial extends Material {
6263
} else {
6364
renderStates.length = maxPassCount;
6465
}
65-
66-
this._refreshShadowPassInfo();
6766
}
6867

6968
/**
70-
* Whethor transparent of first shader pass render state.
69+
* Whether transparent of first shader pass render state.
7170
*/
7271
get isTransparent(): boolean {
7372
return this._isTransparent;
7473
}
7574

7675
set isTransparent(value: boolean) {
7776
if (value !== this._isTransparent) {
78-
this._isTransparent = value;
7977
this.setIsTransparent(0, value);
78+
79+
const { shaderData } = this;
80+
if (value) {
81+
// Use alpha test queue to simulate transparent shadow
82+
shaderData.setFloat(BaseMaterial._shadowCasterRenderQueueProp, RenderQueueType.AlphaTest);
83+
} else {
84+
const alphaCutoff = shaderData.getFloat(BaseMaterial._alphaCutoffProp);
85+
if (alphaCutoff) {
86+
shaderData.setFloat(BaseMaterial._shadowCasterRenderQueueProp, RenderQueueType.AlphaTest);
87+
} else {
88+
shaderData.setFloat(BaseMaterial._shadowCasterRenderQueueProp, RenderQueueType.Opaque);
89+
}
90+
}
91+
92+
this._isTransparent = value;
8093
}
8194
}
8295

@@ -90,8 +103,8 @@ export class BaseMaterial extends Material {
90103

91104
set blendMode(value: BlendMode) {
92105
if (value !== this._blendMode) {
93-
this._blendMode = value;
94106
this.setBlendMode(0, value);
107+
this._blendMode = value;
95108
}
96109
}
97110

@@ -110,8 +123,14 @@ export class BaseMaterial extends Material {
110123
if (shaderData.getFloat(BaseMaterial._alphaCutoffProp) !== value) {
111124
if (value) {
112125
shaderData.enableMacro(BaseMaterial._alphaCutoffMacro);
126+
shaderData.setFloat(BaseMaterial._shadowCasterRenderQueueProp, RenderQueueType.AlphaTest);
113127
} else {
114128
shaderData.disableMacro(BaseMaterial._alphaCutoffMacro);
129+
if (this._isTransparent) {
130+
shaderData.setFloat(BaseMaterial._shadowCasterRenderQueueProp, RenderQueueType.AlphaTest);
131+
} else {
132+
shaderData.setFloat(BaseMaterial._shadowCasterRenderQueueProp, RenderQueueType.Opaque);
133+
}
115134
}
116135

117136
const { renderStates } = this;
@@ -127,10 +146,7 @@ export class BaseMaterial extends Material {
127146
: RenderQueueType.Opaque;
128147
}
129148
}
130-
131149
shaderData.setFloat(BaseMaterial._alphaCutoffProp, value);
132-
133-
this._setShadowPassRenderQueueType();
134150
}
135151
}
136152

@@ -155,7 +171,10 @@ export class BaseMaterial extends Material {
155171
*/
156172
constructor(engine: Engine, shader: Shader) {
157173
super(engine, shader);
158-
this.shaderData.setFloat(BaseMaterial._alphaCutoffProp, 0);
174+
175+
const { shaderData } = this;
176+
shaderData.setFloat(BaseMaterial._alphaCutoffProp, 0);
177+
shaderData.setFloat(BaseMaterial._shadowCasterRenderQueueProp, RenderQueueType.Opaque);
159178
}
160179

161180
/**
@@ -169,22 +188,22 @@ export class BaseMaterial extends Material {
169188
throw "Pass should less than pass count.";
170189
}
171190
const renderState = renderStates[passIndex];
191+
const { shaderData } = this;
172192

173193
if (isTransparent) {
174194
renderState.blendState.targetBlendState.enabled = true;
175195
renderState.depthState.writeEnabled = false;
176196
renderState.renderQueueType = RenderQueueType.Transparent;
177-
this.shaderData.enableMacro(BaseMaterial._transparentMacro);
197+
shaderData.enableMacro(BaseMaterial._transparentMacro);
178198
} else {
179199
renderState.blendState.targetBlendState.enabled = false;
180200
renderState.depthState.writeEnabled = true;
181-
renderState.renderQueueType = this.shaderData.getFloat(BaseMaterial._alphaCutoffProp)
201+
202+
renderState.renderQueueType = shaderData.getFloat(BaseMaterial._alphaCutoffProp)
182203
? RenderQueueType.AlphaTest
183204
: RenderQueueType.Opaque;
184-
this.shaderData.disableMacro(BaseMaterial._transparentMacro);
205+
shaderData.disableMacro(BaseMaterial._transparentMacro);
185206
}
186-
187-
this._setShadowPassRenderQueueType();
188207
}
189208

190209
/**
@@ -260,31 +279,4 @@ export class BaseMaterial extends Material {
260279
target._isTransparent = this._isTransparent;
261280
target._blendMode = this._blendMode;
262281
}
263-
264-
private _refreshShadowPassInfo(): void {
265-
const passes = this.shader.subShaders[0].passes;
266-
const length = passes.length;
267-
this._shadowPass = null;
268-
this._shadowPassIndex = null;
269-
270-
for (let i = 0; i < length; i++) {
271-
const pass = passes[i];
272-
if (pass.name === "ShadowCaster") {
273-
this._shadowPass = pass;
274-
this._shadowPassIndex = i;
275-
}
276-
}
277-
}
278-
279-
private _setShadowPassRenderQueueType(): void {
280-
const shadowPass = this._shadowPass;
281-
282-
if (shadowPass) {
283-
const alphaCutoff = this.shaderData.getFloat(BaseMaterial._alphaCutoffProp);
284-
const renderState = shadowPass._renderState ?? this.renderStates[this._shadowPassIndex];
285-
286-
renderState.renderQueueType =
287-
alphaCutoff || this._isTransparent ? RenderQueueType.AlphaTest : RenderQueueType.Opaque;
288-
}
289-
}
290282
}

packages/core/src/shader/ShaderPool.ts

+7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { PipelineStage } from "../RenderPipeline/enums/PipelineStage";
2+
import { BaseMaterial } from "../material/BaseMaterial";
23
import blitFs from "../shaderlib/extra/Blit.fs.glsl";
34
import blitVs from "../shaderlib/extra/Blit.vs.glsl";
45
import skyProceduralFs from "../shaderlib/extra/SkyProcedural.fs.glsl";
@@ -26,6 +27,8 @@ import unlitFs from "../shaderlib/extra/unlit.fs.glsl";
2627
import unlitVs from "../shaderlib/extra/unlit.vs.glsl";
2728
import { Shader } from "./Shader";
2829
import { ShaderPass } from "./ShaderPass";
30+
import { RenderStateElementKey } from "./enums/RenderStateElementKey";
31+
import { RenderState } from "./state";
2932

3033
/**
3134
* Internal shader pool.
@@ -36,6 +39,10 @@ export class ShaderPool {
3639
const shadowCasterPass = new ShaderPass("ShadowCaster", shadowMapVs, shadowMapFs, {
3740
pipelineStage: PipelineStage.ShadowCaster
3841
});
42+
shadowCasterPass._renderState = new RenderState();
43+
shadowCasterPass._renderStateDataMap[RenderStateElementKey.RenderQueueType] =
44+
BaseMaterial._shadowCasterRenderQueueProp;
45+
3946
const depthOnlyPass = new ShaderPass("DepthOnly", depthOnlyVs, depthOnlyFs, {
4047
pipelineStage: PipelineStage.DepthOnly
4148
});

packages/core/src/shader/state/RenderState.ts

+21-18
Original file line numberDiff line numberDiff line change
@@ -30,30 +30,15 @@ export class RenderState {
3030

3131
/**
3232
* @internal
33-
* @todo Should merge when we can delete material render state.
3433
*/
35-
_applyShaderDataValue(renderStateDataMap: Record<number, ShaderProperty>, shaderData: ShaderData): void {
36-
this.blendState._applyShaderDataValue(renderStateDataMap, shaderData);
37-
this.depthState._applyShaderDataValue(renderStateDataMap, shaderData);
38-
this.stencilState._applyShaderDataValue(renderStateDataMap, shaderData);
39-
this.rasterState._applyShaderDataValue(renderStateDataMap, shaderData);
40-
41-
const renderQueueType = renderStateDataMap[RenderStateElementKey.RenderQueueType];
42-
if (renderQueueType !== undefined) {
43-
this.renderQueueType = shaderData.getFloat(renderQueueType) ?? RenderQueueType.Opaque;
44-
}
45-
}
46-
47-
/**
48-
* @internal
49-
*/
50-
_apply(
34+
_applyStates(
5135
engine: Engine,
5236
frontFaceInvert: boolean,
5337
renderStateDataMap: Record<number, ShaderProperty>,
5438
shaderData: ShaderData
5539
): void {
56-
renderStateDataMap && this._applyShaderDataValue(renderStateDataMap, shaderData);
40+
// @todo: Should merge when we can delete material render state
41+
renderStateDataMap && this._applyStatesByShaderData(renderStateDataMap, shaderData);
5742
const hardwareRenderer = engine._hardwareRenderer;
5843
const lastRenderState = engine._lastRenderState;
5944
const context = engine._renderContext;
@@ -66,4 +51,22 @@ export class RenderState {
6651
context.flipProjection ? !frontFaceInvert : frontFaceInvert
6752
);
6853
}
54+
55+
/**
56+
* @internal
57+
* @todo Should merge when we can delete material render state
58+
*/
59+
_applyRenderQueueByShaderData(renderStateDataMap: Record<number, ShaderProperty>, shaderData: ShaderData): void {
60+
const renderQueueType = renderStateDataMap[RenderStateElementKey.RenderQueueType];
61+
if (renderQueueType !== undefined) {
62+
this.renderQueueType = shaderData.getFloat(renderQueueType) ?? RenderQueueType.Opaque;
63+
}
64+
}
65+
66+
private _applyStatesByShaderData(renderStateDataMap: Record<number, ShaderProperty>, shaderData: ShaderData): void {
67+
this.blendState._applyShaderDataValue(renderStateDataMap, shaderData);
68+
this.depthState._applyShaderDataValue(renderStateDataMap, shaderData);
69+
this.stencilState._applyShaderDataValue(renderStateDataMap, shaderData);
70+
this.rasterState._applyShaderDataValue(renderStateDataMap, shaderData);
71+
}
6972
}

packages/core/src/sky/Sky.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export class Sky {
122122
program.uploadAll(program.materialUniformBlock, materialShaderData);
123123
program.uploadUnGroupTextures();
124124

125-
renderState._apply(engine, false, pass._renderStateDataMap, materialShaderData);
125+
renderState._applyStates(engine, false, pass._renderStateDataMap, materialShaderData);
126126
rhi.drawPrimitive(mesh._primitive, mesh.subMesh, program);
127127
cameraShaderData.setMatrix(RenderContext.vpMatrixProperty, originViewProjMatrix);
128128
}

0 commit comments

Comments
 (0)