From 31737fe20ec71823e4cd64f3926d36a335e109af Mon Sep 17 00:00:00 2001 From: zhuxudong Date: Wed, 27 Jan 2021 13:04:44 +0800 Subject: [PATCH 1/3] chore: add doubleSided to blinnphong and pbr material --- .../core/src/material/BlinnPhongMaterial.ts | 28 +++++++++++++------ packages/core/src/material/PBRMaterial.ts | 18 ++++++++++++ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/core/src/material/BlinnPhongMaterial.ts b/packages/core/src/material/BlinnPhongMaterial.ts index c62bd3118d..61446f9a6f 100644 --- a/packages/core/src/material/BlinnPhongMaterial.ts +++ b/packages/core/src/material/BlinnPhongMaterial.ts @@ -2,6 +2,7 @@ import { Color } from "@oasis-engine/math"; import { Engine } from "../Engine"; import { BlendFactor } from "../shader/enums/BlendFactor"; import { BlendOperation } from "../shader/enums/BlendOperation"; +import { CullMode } from "../shader/enums/CullMode"; import { Shader } from "../shader/Shader"; import { Texture2D } from "../texture/Texture2D"; import { AlphaMode } from "./enums/AlphaMode"; @@ -157,6 +158,7 @@ export class BlinnPhongMaterial extends Material { switch (v) { case AlphaMode.Opaque: + case AlphaMode.CutOff: { target.sourceColorBlendFactor = target.sourceAlphaBlendFactor = BlendFactor.One; target.destinationColorBlendFactor = target.destinationAlphaBlendFactor = BlendFactor.Zero; @@ -174,15 +176,22 @@ export class BlinnPhongMaterial extends Material { this.renderQueueType = RenderQueueType.Transparent; } break; - case AlphaMode.CutOff: - { - target.sourceColorBlendFactor = target.sourceAlphaBlendFactor = BlendFactor.One; - target.destinationColorBlendFactor = target.destinationAlphaBlendFactor = BlendFactor.Zero; - target.colorBlendOperation = target.alphaBlendOperation = BlendOperation.Add; - depthState.writeEnabled = true; - this.renderQueueType = RenderQueueType.AlphaTest; - } - break; + } + } + + /** + * Whether to render both sides. + * @remarks Only the front side is rendered by default + */ + get doubleSided(): boolean { + return this._doubleSided; + } + + set doubleSided(v: boolean) { + if (v) { + this.renderState.rasterState.cullMode = CullMode.Off; + } else { + this.renderState.rasterState.cullMode = CullMode.Back; } } @@ -196,6 +205,7 @@ export class BlinnPhongMaterial extends Material { private _specularTexture: Texture2D; private _shininess: number = 16; private _alphaMode: AlphaMode = AlphaMode.Opaque; + private _doubleSided: boolean = false; constructor(engine: Engine) { super(engine, Shader.find("blinn-phong")); diff --git a/packages/core/src/material/PBRMaterial.ts b/packages/core/src/material/PBRMaterial.ts index 2bab26a06a..996bc19b86 100644 --- a/packages/core/src/material/PBRMaterial.ts +++ b/packages/core/src/material/PBRMaterial.ts @@ -2,6 +2,7 @@ import { Color, Matrix } from "@oasis-engine/math"; import { Engine } from "../Engine"; import { BlendFactor } from "../shader/enums/BlendFactor"; import { BlendOperation } from "../shader/enums/BlendOperation"; +import { CullMode } from "../shader/enums/CullMode"; import { Shader } from "../shader/Shader"; import { TextureCubeMap } from "../texture"; import { Texture2D } from "../texture/Texture2D"; @@ -578,6 +579,22 @@ export class PBRMaterial extends Material { } } + /** + * Whether to render both sides. + * @remarks Only the front side is rendered by default + */ + get doubleSided(): boolean { + return this._doubleSided; + } + + set doubleSided(v: boolean) { + if (v) { + this.renderState.rasterState.cullMode = CullMode.Off; + } else { + this.renderState.rasterState.cullMode = CullMode.Back; + } + } + private _baseColor: Color = new Color(1, 1, 1, 1); private _metallicFactor: number = 1; private _roughnessFactor: number = 1; @@ -614,6 +631,7 @@ export class PBRMaterial extends Material { private _isMetallicWorkflow: boolean = true; private _envMapModeRefract: boolean = false; private _alphaMode: AlphaMode = AlphaMode.Opaque; + private _doubleSided: boolean = false; constructor(engine: Engine) { super(engine, Shader.find("pbr")); From a014b777454c92a48a07d30eaf32e77956a7ea36 Mon Sep 17 00:00:00 2001 From: zhuxudong Date: Wed, 27 Jan 2021 13:05:05 +0800 Subject: [PATCH 2/3] chore: use new api --- packages/loader/src/gltf/glTF.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/loader/src/gltf/glTF.ts b/packages/loader/src/gltf/glTF.ts index a11fec89a7..a43a6768f3 100644 --- a/packages/loader/src/gltf/glTF.ts +++ b/packages/loader/src/gltf/glTF.ts @@ -7,7 +7,6 @@ import { BufferBindFlag, BufferUsage, Camera, - CullMode, Engine, EngineObject, Entity, @@ -306,11 +305,7 @@ export function parseMaterial(gltfMaterial, resources) { } } - if (doubleSided) { - material.renderState.rasterState.cullMode = CullMode.Off; - } else { - material.renderState.rasterState.cullMode = CullMode.Back; - } + material.doubleSided = doubleSided; switch (alphaMode) { case "OPAQUE": From 700151d8f30b84b90d4bc4b7dc5e04a077aeabe2 Mon Sep 17 00:00:00 2001 From: zhuxudong Date: Wed, 27 Jan 2021 14:30:17 +0800 Subject: [PATCH 3/3] fix: use diffuse alpha only --- packages/core/src/shaderlib/extra/blinn-phong.fs.glsl | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/shaderlib/extra/blinn-phong.fs.glsl b/packages/core/src/shaderlib/extra/blinn-phong.fs.glsl index d7c0998508..e3483747c1 100644 --- a/packages/core/src/shaderlib/extra/blinn-phong.fs.glsl +++ b/packages/core/src/shaderlib/extra/blinn-phong.fs.glsl @@ -21,6 +21,7 @@ void main() { #include gl_FragColor = emission + ambient + diffuse + specular; + gl_FragColor.a = diffuse.a; #include