Skip to content

Commit

Permalink
fix: refraction mode
Browse files Browse the repository at this point in the history
  • Loading branch information
hhhhkrx committed Dec 20, 2024
1 parent 62844aa commit ffa2912
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 28 deletions.
88 changes: 62 additions & 26 deletions packages/core/src/material/PBRMaterial.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { ShaderMacro, ShaderProperty } from "../shader";
import { Shader } from "../shader/Shader";
import { Texture2D } from "../texture/Texture2D";
import { PBRBaseMaterial } from "./PBRBaseMaterial";
import { RefractionMode } from "./enums/Refraction";
import { RenderQueueType } from "../shader/enums/RenderQueueType";

/**
* PBR (Metallic-Roughness Workflow) Material.
Expand Down Expand Up @@ -31,8 +33,16 @@ export class PBRMaterial extends PBRBaseMaterial {
private static _sheenTextureProp = ShaderProperty.getByName("material_SheenTexture");
private static _sheenRoughnessTextureProp = ShaderProperty.getByName("material_SheenRoughnessTexture");

private _refractionEnabled = false;
private static _refactionMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_ENABLE_SS_REFRACTION");
protected _refractionMode: RefractionMode;
protected static _refractionMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_ENABLE_SS_REFRACTION");
private static _refractionSphereMacro: ShaderMacro = ShaderMacro.getByName("REFRACTION_SPHERE");
private static _refractionPlaneMacro: ShaderMacro = ShaderMacro.getByName("REFRACTION_PLANE");
private static _refractionThinMacro: ShaderMacro = ShaderMacro.getByName("REFRACTION_THIN");
private static _transmissionMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_TRANSMISSION");
private static _thicknessMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_THICKNESS");
private static _absorptionMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_ABSORPTION");
private static _thicknessTextureMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_THICKNESS_TEXTURE");
private static _transmissionTextureMacro: ShaderMacro = ShaderMacro.getByName("MATERIAL_HAS_TRANSMISSION_TEXTURE");
private static _transmissionProp = ShaderProperty.getByName("material_Transmission");
private static _transmissionTextureProp = ShaderProperty.getByName("material_TransmissionTexture");
private static _attenuationColorProp = ShaderProperty.getByName("material_AttenuationColor");
Expand Down Expand Up @@ -299,20 +309,44 @@ export class PBRMaterial extends PBRBaseMaterial {

/**
* Refraction switch.
* @remarks Use refractionMode to set the refraction shape.
*/
get enableRefraction(): boolean {
return this._refractionEnabled;
get refractionMode(): RefractionMode {
return this._refractionMode;
}

Check warning on line 316 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L315-L316

Added lines #L315 - L316 were not covered by tests

set enableRefraction(value: boolean) {
if (value !== this._refractionEnabled) {
this._refractionEnabled = value;
set refractionMode(value: RefractionMode) {
if (value !== this._refractionMode) {
if (value) {
this.shaderData.enableMacro(PBRMaterial._refactionMacro);
this.shaderData.enableMacro(PBRMaterial._refractionMacro);
this.renderState.renderQueueType = RenderQueueType.Transparent;
this.renderState.blendState.targetBlendState.enabled = false;
} else {
this.shaderData.disableMacro(PBRMaterial._refactionMacro);
this.shaderData.disableMacro(PBRMaterial._refractionMacro);
this.renderState.renderQueueType = RenderQueueType.Opaque;
this.renderState.blendState.targetBlendState.enabled = true;
}

Check warning on line 328 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L325-L328

Added lines #L325 - L328 were not covered by tests
}
this._refractionMode = value;
this.setRefractionMode(value);
}

private setRefractionMode(refractionMode: RefractionMode): void {
this.shaderData.disableMacro(PBRMaterial._refractionSphereMacro);
this.shaderData.disableMacro(PBRMaterial._refractionPlaneMacro);
this.shaderData.disableMacro(PBRMaterial._refractionThinMacro);

switch (refractionMode) {
case RefractionMode.Sphere:
this.shaderData.enableMacro(PBRMaterial._refractionSphereMacro);
break;

Check warning on line 342 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L341-L342

Added lines #L341 - L342 were not covered by tests
case RefractionMode.Plane:
this.shaderData.enableMacro(PBRMaterial._refractionPlaneMacro);
break;
case RefractionMode.Thin:
this.shaderData.enableMacro(PBRMaterial._refractionThinMacro);
break;

Check warning on line 348 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L347-L348

Added lines #L347 - L348 were not covered by tests
}
}

/**
Expand All @@ -324,12 +358,13 @@ export class PBRMaterial extends PBRBaseMaterial {
}

Check warning on line 358 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L357-L358

Added lines #L357 - L358 were not covered by tests

set transmission(value: number) {
this.shaderData.setFloat(PBRMaterial._transmissionProp, value);
if (value) {
this.shaderData.enableMacro("MATERIAL_HAS_TRANSMISSION");
value = Math.max(0, Math.min(1, value));
if (!!this.shaderData.getFloat(PBRMaterial._transmissionProp) !== !!value) {
this.shaderData.disableMacro(PBRMaterial._transmissionMacro);
} else {
this.shaderData.disableMacro("MATERIAL_HAS_TRANSMISSION");
this.shaderData.enableMacro(PBRMaterial._transmissionMacro);
}
this.shaderData.setFloat(PBRMaterial._transmissionProp, value);
}

Check warning on line 368 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L361-L368

Added lines #L361 - L368 were not covered by tests

/**
Expand All @@ -343,9 +378,9 @@ export class PBRMaterial extends PBRBaseMaterial {
set transmissionTexture(value: Texture2D) {
this.shaderData.setTexture(PBRMaterial._transmissionTextureProp, value);
if (value) {
this.shaderData.enableMacro("MATERIAL_HAS_TRANSMISSION_TEXTURE");
this.shaderData.enableMacro(PBRMaterial._transmissionTextureMacro);
} else {
this.shaderData.disableMacro("MATERIAL_HAS_TRANSMISSION_TEXTURE");
this.shaderData.disableMacro(PBRMaterial._transmissionTextureMacro);
}
}

Check warning on line 385 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L379-L385

Added lines #L379 - L385 were not covered by tests

Expand Down Expand Up @@ -373,9 +408,7 @@ export class PBRMaterial extends PBRBaseMaterial {
}

Check warning on line 408 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L407-L408

Added lines #L407 - L408 were not covered by tests

set attenuationDistance(value: number) {
if (value <= 0) {
throw new Error("attenuationDistance must be greater than 0.0");
}
value = Math.max(0, value);
this.shaderData.setFloat(PBRMaterial._attenuationDistanceProp, value);
}

Check warning on line 413 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L411-L413

Added lines #L411 - L413 were not covered by tests

Expand All @@ -389,12 +422,12 @@ export class PBRMaterial extends PBRBaseMaterial {

set thickness(value: number) {
value = Math.max(0, value);
this.shaderData.setFloat(PBRMaterial._thicknessProp, value);
if (value) {
this.shaderData.enableMacro("MATERIAL_HAS_THICKNESS");
if (!!this.shaderData.getFloat(PBRMaterial._thicknessProp) !== !!value) {
this.shaderData.disableMacro(PBRMaterial._thicknessMacro);
} else {
this.shaderData.disableMacro("MATERIAL_HAS_THICKNESS");
this.shaderData.enableMacro(PBRMaterial._thicknessMacro);
}
this.shaderData.setFloat(PBRMaterial._thicknessProp, value);
}

Check warning on line 431 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L424-L431

Added lines #L424 - L431 were not covered by tests

/**
Expand All @@ -408,9 +441,9 @@ export class PBRMaterial extends PBRBaseMaterial {
set thicknessTexture(value: Texture2D) {
this.shaderData.setTexture(PBRMaterial._thicknessTextureProp, value);
if (value) {
this.shaderData.enableMacro("MATERIAL_HAS_THICKNESS_TEXTURE");
this.shaderData.enableMacro(PBRMaterial._thicknessTextureMacro);
} else {
this.shaderData.disableMacro("MATERIAL_HAS_THICKNESS_TEXTURE");
this.shaderData.disableMacro(PBRMaterial._thicknessTextureMacro);
}
}

Check warning on line 448 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L442-L448

Added lines #L442 - L448 were not covered by tests
/**
Expand All @@ -428,6 +461,9 @@ export class PBRMaterial extends PBRBaseMaterial {
shaderData.setVector4(PBRMaterial._iridescenceInfoProp, new Vector4(0, 1.3, 100, 400));
const sheenColor = new Color(0, 0, 0);
shaderData.setColor(PBRMaterial._sheenColorProp, sheenColor);
this.refractionMode = RefractionMode.Plane;
shaderData.setFloat(PBRMaterial._thicknessProp, 0);
shaderData.setFloat(PBRMaterial._attenuationDistanceProp, Infinity);
const attenuationColor = new Color(1, 1, 1);
shaderData.setColor(PBRMaterial._attenuationColorProp, attenuationColor);
// @ts-ignore
Expand All @@ -448,9 +484,9 @@ export class PBRMaterial extends PBRBaseMaterial {
attenuationColor._onValueChanged = () => {
const enableAbsorption = attenuationColor.r + attenuationColor.g + attenuationColor.b > 1;
if (enableAbsorption) {
this.shaderData.enableMacro("MATERIAL_HAS_ABSORPTION");
this.shaderData.enableMacro(PBRMaterial._absorptionMacro);
} else {
this.shaderData.disableMacro("MATERIAL_HAS_ABSORPTION");
this.shaderData.disableMacro(PBRMaterial._absorptionMacro);
}

Check warning on line 490 in packages/core/src/material/PBRMaterial.ts

View check run for this annotation

Codecov / codecov/patch

packages/core/src/material/PBRMaterial.ts#L489-L490

Added lines #L489 - L490 were not covered by tests
};
}
Expand Down
11 changes: 11 additions & 0 deletions packages/core/src/material/enums/Refraction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/**
* Refraction mode.
*/
export enum RefractionMode {
/** Refraction shape is sphere */
Sphere,
/** Refraction shape is plane */
Plane,
/** Refraction shape is thin */
Thin
}
3 changes: 1 addition & 2 deletions packages/shader-shaderlab/src/shaders/shadingPBR/BTDF.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@

#include "Refraction.glsl"

sampler2D camera_OpaqueTexture;

#ifdef MATERIAL_ENABLE_SS_REFRACTION
sampler2D camera_OpaqueTexture;
vec3 evaluateRefraction(SurfaceData surfaceData, BRDFData brdfData, vec3 specularColor) {
RefractionModel ray;
#if defined(REFRACTION_SPHERE)
Expand Down

0 comments on commit ffa2912

Please sign in to comment.