From 163bddbf31f38b258d7e5047007d0a50b7248680 Mon Sep 17 00:00:00 2001 From: zhuxudong Date: Fri, 21 Apr 2023 16:22:07 +0800 Subject: [PATCH 1/3] feat: add pbr ior --- packages/core/src/material/PBRBaseMaterial.ts | 15 +++++++++++++++ .../core/src/shaderlib/pbr/pbr_frag_define.glsl | 2 ++ packages/core/src/shaderlib/pbr/pbr_helper.glsl | 8 +++++++- .../src/gltf/extensions/KHR_materials_ior.ts | 15 +++++++++++++++ packages/loader/src/gltf/extensions/index.ts | 1 + packages/loader/src/gltf/parser/MaterialParser.ts | 5 +++++ 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/packages/core/src/material/PBRBaseMaterial.ts b/packages/core/src/material/PBRBaseMaterial.ts index 558ca6b53b..f0edaf7167 100644 --- a/packages/core/src/material/PBRBaseMaterial.ts +++ b/packages/core/src/material/PBRBaseMaterial.ts @@ -20,6 +20,19 @@ export abstract class PBRBaseMaterial extends BaseMaterial { private static _clearCoatRoughnessTextureProp = Shader.getPropertyByName("u_clearCoatRoughnessTexture"); private static _clearCoatNormalTextureProp = Shader.getPropertyByName("u_clearCoatNormalTexture"); + private static _iorProp = Shader.getPropertyByName("material_IOR"); + + /** + * Index Of Refraction, default is 1.5. + */ + get ior(): number { + return this.shaderData.getFloat(PBRBaseMaterial._iorProp); + } + + set ior(v: number) { + this.shaderData.setFloat(PBRBaseMaterial._iorProp, v); + } + /** * Base color. */ @@ -266,5 +279,7 @@ export abstract class PBRBaseMaterial extends BaseMaterial { shaderData.setFloat(PBRBaseMaterial._clearCoatProp, 0); shaderData.setFloat(PBRBaseMaterial._clearCoatRoughnessProp, 0); + + shaderData.setFloat(PBRBaseMaterial._iorProp, 1.5); } } diff --git a/packages/core/src/shaderlib/pbr/pbr_frag_define.glsl b/packages/core/src/shaderlib/pbr/pbr_frag_define.glsl index bc7a29f6c4..14916e68d1 100644 --- a/packages/core/src/shaderlib/pbr/pbr_frag_define.glsl +++ b/packages/core/src/shaderlib/pbr/pbr_frag_define.glsl @@ -87,3 +87,5 @@ struct Material { #endif }; + +uniform float material_IOR; diff --git a/packages/core/src/shaderlib/pbr/pbr_helper.glsl b/packages/core/src/shaderlib/pbr/pbr_helper.glsl index 8a16246cf9..6c29a0619c 100644 --- a/packages/core/src/shaderlib/pbr/pbr_helper.glsl +++ b/packages/core/src/shaderlib/pbr/pbr_helper.glsl @@ -17,6 +17,10 @@ float getAARoughnessFactor(vec3 normal) { #endif } +float getF0(float ior, float outsideIor){ + return pow2( (ior - outsideIor) / (ior + outsideIor) ); +} + void initGeometry(out Geometry geometry){ geometry.position = v_pos; geometry.viewDir = normalize(u_cameraPos - v_pos); @@ -52,6 +56,8 @@ void initMaterial(out Material material, const in Geometry geometry){ vec3 specularColor = u_PBRSpecularColor; float glossiness = u_glossiness; float alphaCutoff = u_alphaCutoff; + float F0 = getF0(material_IOR, 1.0); + #ifdef BASETEXTURE vec4 baseTextureColor = texture2D(u_baseTexture, v_uv); @@ -90,7 +96,7 @@ void initMaterial(out Material material, const in Geometry geometry){ #ifdef IS_METALLIC_WORKFLOW material.diffuseColor = baseColor.rgb * ( 1.0 - metal ); - material.specularColor = mix( vec3( 0.04), baseColor.rgb, metal ); + material.specularColor = mix( vec3(F0), baseColor.rgb, metal ); material.roughness = roughness; #else float specularStrength = max( max( specularColor.r, specularColor.g ), specularColor.b ); diff --git a/packages/loader/src/gltf/extensions/KHR_materials_ior.ts b/packages/loader/src/gltf/extensions/KHR_materials_ior.ts index e69de29bb2..db81cd14b6 100644 --- a/packages/loader/src/gltf/extensions/KHR_materials_ior.ts +++ b/packages/loader/src/gltf/extensions/KHR_materials_ior.ts @@ -0,0 +1,15 @@ +import { PBRBaseMaterial } from "@galacean/engine-core"; +import { IKHRMaterialsIor } from "./Schema"; + +import { registerExtension } from "../parser/Parser"; +import { ParserContext } from "../parser/ParserContext"; +import { ExtensionParser } from "./ExtensionParser"; + +@registerExtension("KHR_materials_ior") +class KHR_materials_ior extends ExtensionParser { + parseEngineResource(schema: IKHRMaterialsIor, material: PBRBaseMaterial, context: ParserContext): void { + const { ior = 1.5 } = schema; + + material.ior = ior; + } +} diff --git a/packages/loader/src/gltf/extensions/index.ts b/packages/loader/src/gltf/extensions/index.ts index 5efe92e626..a20a7286e1 100644 --- a/packages/loader/src/gltf/extensions/index.ts +++ b/packages/loader/src/gltf/extensions/index.ts @@ -12,3 +12,4 @@ import "./KHR_mesh_quantization"; import "./KHR_texture_basisu"; import "./KHR_texture_transform"; import "./GALACEAN_materials_remap"; +import "./KHR_materials_ior"; diff --git a/packages/loader/src/gltf/parser/MaterialParser.ts b/packages/loader/src/gltf/parser/MaterialParser.ts index 8eb0b6499a..a6bfd1ced2 100644 --- a/packages/loader/src/gltf/parser/MaterialParser.ts +++ b/packages/loader/src/gltf/parser/MaterialParser.ts @@ -49,6 +49,7 @@ export class MaterialParser extends Parser { KHR_materials_unlit, KHR_materials_pbrSpecularGlossiness, KHR_materials_clearcoat, + KHR_materials_ior, OASIS_materials_remap } = extensions; @@ -74,6 +75,10 @@ export class MaterialParser extends Parser { Parser.parseEngineResource("KHR_materials_clearcoat", KHR_materials_clearcoat, material, context); } + if (KHR_materials_ior) { + Parser.parseEngineResource("KHR_materials_ior", KHR_materials_ior, material, context); + } + if (pbrMetallicRoughness) { const { baseColorFactor, baseColorTexture, metallicFactor, roughnessFactor, metallicRoughnessTexture } = pbrMetallicRoughness; From 319c3de5b691ad7813ecd4ec9197edd837fdec48 Mon Sep 17 00:00:00 2001 From: zhuxudong Date: Fri, 21 Apr 2023 17:07:14 +0800 Subject: [PATCH 2/3] chore: remove from specular mode --- packages/core/src/material/PBRBaseMaterial.ts | 15 --------------- packages/core/src/material/PBRMaterial.ts | 14 ++++++++++++++ .../src/gltf/extensions/KHR_materials_ior.ts | 4 ++-- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/packages/core/src/material/PBRBaseMaterial.ts b/packages/core/src/material/PBRBaseMaterial.ts index f0edaf7167..558ca6b53b 100644 --- a/packages/core/src/material/PBRBaseMaterial.ts +++ b/packages/core/src/material/PBRBaseMaterial.ts @@ -20,19 +20,6 @@ export abstract class PBRBaseMaterial extends BaseMaterial { private static _clearCoatRoughnessTextureProp = Shader.getPropertyByName("u_clearCoatRoughnessTexture"); private static _clearCoatNormalTextureProp = Shader.getPropertyByName("u_clearCoatNormalTexture"); - private static _iorProp = Shader.getPropertyByName("material_IOR"); - - /** - * Index Of Refraction, default is 1.5. - */ - get ior(): number { - return this.shaderData.getFloat(PBRBaseMaterial._iorProp); - } - - set ior(v: number) { - this.shaderData.setFloat(PBRBaseMaterial._iorProp, v); - } - /** * Base color. */ @@ -279,7 +266,5 @@ export abstract class PBRBaseMaterial extends BaseMaterial { shaderData.setFloat(PBRBaseMaterial._clearCoatProp, 0); shaderData.setFloat(PBRBaseMaterial._clearCoatRoughnessProp, 0); - - shaderData.setFloat(PBRBaseMaterial._iorProp, 1.5); } } diff --git a/packages/core/src/material/PBRMaterial.ts b/packages/core/src/material/PBRMaterial.ts index 8ebe15762c..cc64aa45e2 100644 --- a/packages/core/src/material/PBRMaterial.ts +++ b/packages/core/src/material/PBRMaterial.ts @@ -11,6 +11,19 @@ export class PBRMaterial extends PBRBaseMaterial { private static _roughnessProp = Shader.getPropertyByName("u_roughness"); private static _roughnessMetallicTextureProp = Shader.getPropertyByName("u_roughnessMetallicTexture"); + private static _iorProp = Shader.getPropertyByName("material_IOR"); + + /** + * Index Of Refraction, default is 1.5. + */ + get ior(): number { + return this.shaderData.getFloat(PBRMaterial._iorProp); + } + + set ior(v: number) { + this.shaderData.setFloat(PBRMaterial._iorProp, v); + } + /** * Metallic, default 1.0. */ @@ -58,6 +71,7 @@ export class PBRMaterial extends PBRBaseMaterial { super(engine, Shader.find("pbr")); this.shaderData.setFloat(PBRMaterial._metallicProp, 1); this.shaderData.setFloat(PBRMaterial._roughnessProp, 1); + this.shaderData.setFloat(PBRMaterial._iorProp, 1.5); } /** diff --git a/packages/loader/src/gltf/extensions/KHR_materials_ior.ts b/packages/loader/src/gltf/extensions/KHR_materials_ior.ts index db81cd14b6..eef10a77d6 100644 --- a/packages/loader/src/gltf/extensions/KHR_materials_ior.ts +++ b/packages/loader/src/gltf/extensions/KHR_materials_ior.ts @@ -1,4 +1,4 @@ -import { PBRBaseMaterial } from "@galacean/engine-core"; +import { PBRMaterial } from "@galacean/engine-core"; import { IKHRMaterialsIor } from "./Schema"; import { registerExtension } from "../parser/Parser"; @@ -7,7 +7,7 @@ import { ExtensionParser } from "./ExtensionParser"; @registerExtension("KHR_materials_ior") class KHR_materials_ior extends ExtensionParser { - parseEngineResource(schema: IKHRMaterialsIor, material: PBRBaseMaterial, context: ParserContext): void { + parseEngineResource(schema: IKHRMaterialsIor, material: PBRMaterial, context: ParserContext): void { const { ior = 1.5 } = schema; material.ior = ior; From db308e5d520fc915a48e992dc45c8d065a2a4862 Mon Sep 17 00:00:00 2001 From: zhuxudong Date: Sun, 23 Apr 2023 13:00:11 +0800 Subject: [PATCH 3/3] chore: refactor comment --- packages/core/src/material/PBRMaterial.ts | 11 +++++++---- packages/core/src/shaderlib/pbr/pbr_helper.glsl | 6 +----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/core/src/material/PBRMaterial.ts b/packages/core/src/material/PBRMaterial.ts index cc64aa45e2..160379e45e 100644 --- a/packages/core/src/material/PBRMaterial.ts +++ b/packages/core/src/material/PBRMaterial.ts @@ -14,18 +14,20 @@ export class PBRMaterial extends PBRBaseMaterial { private static _iorProp = Shader.getPropertyByName("material_IOR"); /** - * Index Of Refraction, default is 1.5. + * Index Of Refraction. + * @defaultValue `1.5` */ get ior(): number { return this.shaderData.getFloat(PBRMaterial._iorProp); } set ior(v: number) { - this.shaderData.setFloat(PBRMaterial._iorProp, v); + this.shaderData.setFloat(PBRMaterial._iorProp, Math.min(v, 0)); } /** - * Metallic, default 1.0. + * Metallic. + * @defaultValue `1.0` */ get metallic(): number { return this.shaderData.getFloat(PBRMaterial._metallicProp); @@ -36,7 +38,8 @@ export class PBRMaterial extends PBRBaseMaterial { } /** - * Roughness, default 1.0. + * Roughness. default 1.0. + * @defaultValue `1.0` */ get roughness(): number { return this.shaderData.getFloat(PBRMaterial._roughnessProp); diff --git a/packages/core/src/shaderlib/pbr/pbr_helper.glsl b/packages/core/src/shaderlib/pbr/pbr_helper.glsl index 6c29a0619c..e33c90e9cb 100644 --- a/packages/core/src/shaderlib/pbr/pbr_helper.glsl +++ b/packages/core/src/shaderlib/pbr/pbr_helper.glsl @@ -17,10 +17,6 @@ float getAARoughnessFactor(vec3 normal) { #endif } -float getF0(float ior, float outsideIor){ - return pow2( (ior - outsideIor) / (ior + outsideIor) ); -} - void initGeometry(out Geometry geometry){ geometry.position = v_pos; geometry.viewDir = normalize(u_cameraPos - v_pos); @@ -56,7 +52,7 @@ void initMaterial(out Material material, const in Geometry geometry){ vec3 specularColor = u_PBRSpecularColor; float glossiness = u_glossiness; float alphaCutoff = u_alphaCutoff; - float F0 = getF0(material_IOR, 1.0); + float F0 = pow2( (material_IOR - 1.0) / (material_IOR + 1.0) ) #ifdef BASETEXTURE