Skip to content

Commit

Permalink
fix(light): fix shader light position (#175)
Browse files Browse the repository at this point in the history
fix geometry bound gen
fix can not remove light
fix can not remove light
fix light position
fix light position
  • Loading branch information
ZenderJK committed May 29, 2023
1 parent 8f275c9 commit b2ba00f
Show file tree
Hide file tree
Showing 15 changed files with 64 additions and 92 deletions.
2 changes: 1 addition & 1 deletion public
Submodule public updated 2 files
+1 −20,150 json/anim_0.json
+ sky/LDR_sky.jpg
3 changes: 3 additions & 0 deletions samples/utils/GUIUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ export class GUIUtil {
GUIHelp.addColor(light, 'lightColor');
GUIHelp.add(light, 'intensity', 0.0, 160.0, 0.01);
GUIHelp.add(light, 'indirect', 0.0, 10.0, 0.01);
GUIHelp.add(light, 'castShadow');

open && GUIHelp.open();
GUIHelp.endFolder();
Expand All @@ -71,6 +72,7 @@ export class GUIUtil {
GUIHelp.add(light, 'radius', 0.0, 1000.0, 0.001);
GUIHelp.add(light, 'range', 0.0, 1000.0, 0.001);
GUIHelp.add(light, 'quadratic', 0.0, 2.0, 0.001);
GUIHelp.add(light, 'castShadow');

GUIHelp.open();
GUIHelp.endFolder();
Expand All @@ -94,6 +96,7 @@ export class GUIUtil {
GUIHelp.add(light, 'range', 0.0, 1000.0, 0.001);
GUIHelp.add(light, 'outerAngle', 0.0, 180.0, 0.001);
GUIHelp.add(light, 'innerAngle', 0.0, 100.0, 0.001);
GUIHelp.add(light, 'castShadow');

GUIHelp.open();
GUIHelp.endFolder();
Expand Down
1 change: 1 addition & 0 deletions src/Engine3D.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { ShaderLib } from './assets/shader/ShaderLib';
import { ShaderUtil } from './gfx/graphics/webGpu/shader/util/ShaderUtil';
import { ComponentCollect } from './gfx/renderJob/collect/ComponentCollect';
import { ShadowLightsCollect } from './gfx/renderJob/collect/ShadowLightsCollect';
import { ProfilerUtil } from '.';

/**
* Orillusion 3D Engine
Expand Down
4 changes: 2 additions & 2 deletions src/assets/shader/cluster/ClusterLighting_cs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ var<private> clusterTileX:f32 ;
var<private> clusterTileY:f32 ;
var<private> clusterTileZ:f32 ;
@group(0) @binding(1) var<storage, read> models : Uniforms;
// @group(0) @binding(1) var<storage, read> models : Uniforms;
@group(0) @binding(2) var<uniform> clustersUniform : ClustersUniform;
@group(0) @binding(3) var<storage,read> clusterBuffer : array<ClusterBox>;
@group(0) @binding(4) var<storage,read> lightBuffer : array<Light>;
Expand Down Expand Up @@ -97,7 +97,7 @@ fn GetSqdisPointAABB( pos:vec3<f32>, clusterIndex:u32 ) -> f32
fn TestSphereAABB( lightIndex:i32 , clusterIndex : u32 ) -> bool
{
let light = lightBuffer[lightIndex];
let lightPos = models.matrix[u32(light.lightMatrixIndex)][3].xyz;
let lightPos = light.position.xyz;
var radius = light.range * 2.0 ;
let spherePos = globalUniform.viewMat * vec4<f32>(lightPos.xyz, 1.0) ;
let sqDistance = GetSqdisPointAABB(spherePos.xyz , clusterIndex);
Expand Down
1 change: 0 additions & 1 deletion src/assets/shader/lighting/BxDF_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,6 @@ export let BxDF_frag: string = /*wgsl*/ `
#endif
var envRef = kS * approximateSpecularIBL( fragData.SpecularColor , fragData.Roughness , fragData.R ) ;//* (materialUniform.ior - 1.0) ;
var irradiance = diffuseIrradiance ;
#if USEGI
irradiance += getIrradiance().rgb ;
Expand Down
2 changes: 1 addition & 1 deletion src/assets/shader/lighting/IESProfiles_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export let IESProfiles_frag: string = /*wgsl*/ `
let lightBitangent = normalize( cross( tangent, light.direction ) );
let lightMatrix = mat4x4( vec4<f32>(light.direction.xyz, 0.0), vec4<f32>(lightBitangent.xyz, 0.0), vec4<f32>(tangent.xyz, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0) );
let lightMatrixInv = transpose(lightMatrix);
let lightPos = models.matrix[u32(light.lightMatrixIndex)][3].xyz;
let lightPos = light.position.xyz;
let l = lightPos - wPos;
let toLight = normalize(l);
let localToLight = (vec4<f32>(toLight.xyz, 0.0) * lightMatrixInv).xyz;
Expand Down
4 changes: 2 additions & 2 deletions src/assets/shader/lighting/LightingFunction_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ fn directLighting( albedo:vec3<f32>, N:vec3<f32>, V:vec3<f32>, roughness:f32 ,
fn pointLighting( albedo:vec3<f32>,WP:vec3<f32>, N:vec3<f32>, V:vec3<f32>, roughness:f32 , light:LightData ) -> vec3<f32> {
var color = vec3<f32>(0.0) ;
let lightPos = models.matrix[u32(light.lightMatrixIndex)][3].xyz;
let lightPos = light.position.xyz;
var dir = lightPos.xyz - WP ;
let dist = length(dir);
if(dist != 0.0){
Expand Down Expand Up @@ -85,7 +85,7 @@ fn getDistanceAtten( light:LightData , dist : f32 ) -> f32 {
}
fn spotLighting( albedo:vec3<f32>,WP:vec3<f32>, N:vec3<f32>, V:vec3<f32>, roughness:f32 , light:LightData ) -> vec3<f32> {
let lightPos = models.matrix[u32(light.lightMatrixIndex)][3].xyz;
let lightPos = light.position.xyz;
var dir = lightPos.xyz - WP ;
let dist = length(dir) ;
if(dist != 0.0){
Expand Down
5 changes: 2 additions & 3 deletions src/assets/shader/materials/ColorLitShader.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export class ColorLitShader {
public static Ori_AllShader:string = /*wgsl*/`
public static Ori_AllShader: string = /*wgsl*/`
#include "Common_vert"
#include "Common_frag"
#include "BxDF_frag"
Expand All @@ -20,8 +20,7 @@ export class ColorLitShader {
ORI_ShadingInput.Normal = ORI_VertexVarying.vWorldNormal.rgb ;
#if USE_SHADOWMAPING
directShadowMaping(globalUniform.shadowBias);
pointShadowMapCompare(globalUniform.pointShadowBias);
useShadow();
#endif
BxDFShading();
Expand Down
4 changes: 1 addition & 3 deletions src/assets/shader/materials/PBRLItShader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,9 @@ export let PBRLItShader: string = /*wgsl*/ `
// #endif
#if USE_SHADOWMAPING
directShadowMaping(globalUniform.shadowBias);
pointShadowMapCompare(globalUniform.pointShadowBias);
useShadow();
#endif
// ORI_ShadingInput.BaseColor = vec4<f32>(sRGBToLinear(ORI_ShadingInput.BaseColor.xyz),ORI_ShadingInput.BaseColor.w);
#if USE_ARMC
Expand Down
17 changes: 12 additions & 5 deletions src/assets/shader/materials/program/ShadowMapping_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ export let ShadowMapping_frag: string = /*wgsl*/ `
@group(1) @binding(auto) var pointShadowMapSampler: sampler;
@group(1) @binding(auto) var pointShadowMap: texture_depth_cube_array;
struct ShadowStruct{
struct ShadowStruct{
directShadowVisibility: array<f32, 8>,
pointShadows: array<f32, 8>,
}
pointShadows: array<f32, 8>,
}
var<private>shadowStrut: ShadowStruct;
Expand All @@ -24,6 +24,13 @@ export let ShadowMapping_frag: string = /*wgsl*/ `
@group(2) @binding(5) var<storage,read> shadowBuffer: ShadowBuffer;
fn useShadow(){
shadowStrut.directShadowVisibility = array<f32, 8>( 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0) ;
shadowStrut.pointShadows = array<f32, 8>( 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0) ;
directShadowMaping(globalUniform.shadowBias);
pointShadowMapCompare(globalUniform.pointShadowBias);
}
fn directShadowMaping(shadowBias: f32) {
for (var i: i32 = shadowBuffer.nDirShadowStart; i < shadowBuffer.nDirShadowEnd ; i = i + 1) {
let ldx = shadowBuffer.shadowLights[i];
Expand Down Expand Up @@ -66,7 +73,7 @@ export let ShadowMapping_frag: string = /*wgsl*/ `
}
}
fn pointShadowMapCompare(shadowBias: f32){
fn pointShadowMapCompare(shadowBias: f32){
let worldPos = ORI_VertexVarying.vWorldPos.xyz;
let offset = 0.1;
// let lightIndex = getCluster(ORI_VertexVarying.fragCoord);
Expand All @@ -80,7 +87,7 @@ export let ShadowMapping_frag: string = /*wgsl*/ `
shadowStrut.pointShadows[light.castShadow] = 1.0;
#if USE_SHADOWMAPING
let lightPos = models.matrix[u32(light.lightMatrixIndex)][3].xyz;
let lightPos = light.position.xyz;
var shadow = 0.0;
let frgToLight = worldPos - lightPos.xyz;
var dir: vec3<f32> = normalize(frgToLight);
Expand Down
34 changes: 17 additions & 17 deletions src/components/lights/DirectLight.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,24 +62,24 @@ export class DirectLight extends LightBase {
this.onChange();
}

/**
* Set cast shadow
* @param value
**/
public set castShadow(value: boolean) {
if (value != this._castShadow) {
this.onChange();
}
this._castShadow = value;
}
// /**
// * Set cast shadow
// * @param value
// **/
// public set castShadow(value: boolean) {
// if (value != this._castShadow) {
// this.onChange();
// }
// this._castShadow = value;
// }

/**
* get cast shadow
* @return boolean
* */
public get castShadow(): boolean {
return this.lightData.castShadowIndex as number >= 0;
}
// /**
// * get cast shadow
// * @return boolean
// * */
// public get castShadow(): boolean {
// return this.lightData.castShadowIndex as number >= 0;
// }

/**
* enable light debug gui
Expand Down
37 changes: 18 additions & 19 deletions src/components/lights/LightBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,18 @@ export class LightBase extends ComponentBase implements ILight {
}

public start(): void {
this.transform.onPositionChange = () => this.onPositionChange();
this.transform.onScaleChange = () => this.onScaleChange();
this.transform.onRotationChange = () => this.onRotChange();
this.onPositionChange();
this.onRotChange();
this.onScaleChange();
}

protected onPositionChange() {
this.lightData.lightPosition.copyFrom(this.transform.worldPosition);
}

protected onRotChange() {
if (this.dirFix == 1) {
this.lightData.direction.copyFrom(this.transform.forward);
Expand All @@ -99,20 +105,11 @@ export class LightBase extends ComponentBase implements ILight {
public onEnable(): void {
this.onChange();
EntityCollect.instance.addLight(this.transform.scene3D, this);

if (this._castShadow) {
this.needUpdateShadow = true;
ShadowLightsCollect.addShadowLight(this);
}
}

public onDisable(): void {
this.onChange();
EntityCollect.instance.removeLight(this.transform.scene3D, this);

if (this._castShadow) {
ShadowLightsCollect.removeShadowLight(this);
}
}

public set iesProfiles(iesProfiles: IESProfiles) {
Expand Down Expand Up @@ -199,12 +196,20 @@ export class LightBase extends ComponentBase implements ILight {
this.lightData.intensity = value;
this.onChange();
}

/**
* get cast shadow
* @return boolean
* Cast Light Shadow
* @param value
* */
public set castShadow(value: boolean) {
if (value != this._castShadow) {
this._castShadow = value;
this.onChange();
}
}

public get castShadow(): boolean {
return this.lightData.castShadowIndex as number >= 0;
return this._castShadow;
}

/**
Expand All @@ -213,13 +218,7 @@ export class LightBase extends ComponentBase implements ILight {
public get shadowIndex(): number {
return this.lightData.castShadowIndex as number;
}
/**
* set cast shadow
* @param value is true , that can cast shadow
* */
public set castShadow(value: boolean) {
if (value) this.onChange();
}


/**
* get gi is enable
Expand Down
11 changes: 1 addition & 10 deletions src/components/lights/PointLight.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,7 @@ export class PointLight extends LightBase {
this.onChange();
}

/**
* Cast Light Shadow
* @param value
* */
public set castShadow(value: boolean) {
if (value != this._castShadow) {
this.onChange();
}
this._castShadow = value;
}


public start(): void {
this.transform.rotationX = 90;
Expand Down
11 changes: 0 additions & 11 deletions src/components/lights/SpotLight.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,6 @@ export class SpotLight extends LightBase {
this.onChange();
}

/**
* Cast Light Shadow
* @param value
* */
public set castShadow(value: boolean) {
if (value != this._castShadow) {
this.onChange();
}
this._castShadow = value;
}

public start(): void {
super.start();
this.lightData.lightType = LightType.SpotLight;
Expand Down
20 changes: 3 additions & 17 deletions src/gfx/renderJob/collect/ShadowLightsCollect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ export class ShadowLightsCollect {
list = [];
this.directionLightList.set(scene, list);
}
if (light.lightData.lightType == LightType.DirectionLight && !light['shadowCamera']) {
if (!light['shadowCamera']) {
light['shadowCamera'] = CameraUtil.createCamera3DObject(null, 'shadowCamera');
light['shadowCamera'].name = UUID();
light['shadowCamera'].isShadowCamera = true;
Expand All @@ -141,21 +141,7 @@ export class ShadowLightsCollect {
list.push(light);
}
return list;
} else if (light.lightData.lightType == LightType.PointLight) {
let list = this.pointLightList.get(scene);
if (!list) {
list = [];
this.pointLightList.set(scene, list);
}
let has = list.indexOf(light) == -1;
if (has) {
if (list.length < 8) {
light.lightData.castShadowIndex = list.length;
}
list.push(light);
}
return list;
} else if (light.lightData.lightType == LightType.SpotLight) {
} else if (light.lightData.lightType == LightType.PointLight || light.lightData.lightType == LightType.SpotLight) {
let list = this.pointLightList.get(scene);
if (!list) {
list = [];
Expand Down Expand Up @@ -183,7 +169,7 @@ export class ShadowLightsCollect {
}
}
return list;
} else if (light.lightData.lightType == LightType.PointLight) {
} else if (light.lightData.lightType == LightType.PointLight || light.lightData.lightType == LightType.SpotLight) {
let list = this.pointLightList.get(light.transform.view3D.scene);
if (list) {
let index = list.indexOf(light);
Expand Down

0 comments on commit b2ba00f

Please sign in to comment.