Skip to content

Commit

Permalink
feat: add log z depth
Browse files Browse the repository at this point in the history
add log z depth
fix cluster depth getTile
  • Loading branch information
ZenderJK committed Aug 25, 2023
1 parent fd54eb6 commit 520b2bb
Show file tree
Hide file tree
Showing 16 changed files with 119 additions and 66 deletions.
2 changes: 1 addition & 1 deletion samples/base/Sample_InitEngine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class Sample_InitEngine {

// init camera3D
let mainCamera = CameraUtil.createCamera3D(null, scene);
mainCamera.perspective(60, Engine3D.aspect, 0.1, 6500000 * 2);
mainCamera.perspective(60, Engine3D.aspect, 0.1, 6500000 * 4);
let hoverCameraController = mainCamera.object3D.addComponent(HoverCameraController);
hoverCameraController.setCamera(15, -30, 6500000 * 2);

Expand Down
58 changes: 58 additions & 0 deletions samples/lights/Sample_ClusterLight.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { GUIHelp } from "@orillusion/debug/GUIHelp";
import { Scene3D, Engine3D, AtmosphericComponent, CameraUtil, HoverCameraController, Vector3, View3D, SphereGeometry, Object3D, MeshRenderer, LitMaterial, PointLight, BoxGeometry, Object3DUtil } from "@orillusion/core";
import { GUIUtil } from "@samples/utils/GUIUtil";

// sample of point light shadow
class Sample_ClusterLight {
scene: Scene3D;
lightObj: Object3D;
async run() {

Engine3D.setting.shadow.enable = true;
Engine3D.setting.shadow.debug = true;
Engine3D.setting.material.materialChannelDebug = true;
Engine3D.setting.material.materialDebug = true;

await Engine3D.init({});

this.scene = new Scene3D();
let sky = this.scene.addComponent(AtmosphericComponent);

// init camera3D
let mainCamera = CameraUtil.createCamera3D(null, this.scene);
mainCamera.perspective(60, Engine3D.aspect, 1, 2000.0);
//set camera data
mainCamera.object3D.addComponent(HoverCameraController).setCamera(0, -45, 50);

await this.initScene(this.scene);
sky.relativeTransform = this.lightObj.transform;

let view = new View3D();
view.scene = this.scene;
view.camera = mainCamera;

Engine3D.startRenderView(view);
}

async initScene(scene: Scene3D) {
let lightObj3D = this.lightObj = new Object3D();
lightObj3D.y = 25;

//make point light
let pointLight = lightObj3D.addComponent(PointLight);
pointLight.range = 100;
pointLight.intensity = 5;
pointLight.castShadow = true;
scene.addChild(lightObj3D);

//show gui
GUIHelp.init()
GUIUtil.showPointLightGUI(pointLight);

//create floor
let floor = Object3DUtil.GetSingleCube(10, 1, 10, 0.5, 0.5, 0.5);
this.scene.addChild(floor);
}
}

new Sample_ClusterLight().run();
34 changes: 18 additions & 16 deletions src/assets/shader/cluster/ClusterBoundsSource_cs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ export let ClusterBoundsSource_cs: string = /* wgsl */`
fn ScreenToView(screen : vec4<f32>) -> vec4<f32> {
let texCoord = screen.xy / vec2<f32>(clustersUniform.screenWidth, clustersUniform.screenHeight);
let clip = vec4<f32>(vec2<f32>(texCoord.x * 2.0 - 1.0 , 1.0 - 2.0 * texCoord.y), screen.z, screen.w);
let clip = vec4<f32>(vec2<f32>(texCoord.x , 1.0 - texCoord.y) * 2.0 - 1.0 , screen.z , screen.w);
// (tex.x * 2.0 - 1.0, 1.0 - 2.0 * tex.y, screenPos.z, screenPos.w)
// convertNDCToView(clip);
return convertNDCToView(clip);
}
Expand Down Expand Up @@ -76,26 +76,28 @@ export let ClusterBoundsSource_cs: string = /* wgsl */`
let titleSize = vec2<f32>( clustersUniform.screenWidth / tx , clustersUniform.screenHeight / ty ) ;
var minPointSs = vec4<f32>(vec2<f32>(f32(i) , f32(j)) * titleSize,0.0, 1.0);
var maxPointSs = vec4<f32>(vec2<f32>(f32(i) + 1.0, f32(j) + 1.0) * titleSize, 0.0, 1.0);
var minPointSs = vec4<f32>(vec2<f32>(f32(i) , f32(j)) * titleSize, 0.0, 1.0);
var maxPointVs = ScreenToView(maxPointSs).xyz;
var minPointVs = ScreenToView(minPointSs).xyz;
var tileNear = clustersUniform.near * pow(clustersUniform.far / clustersUniform.near, f32(k) / clustersUniform.clusterTileZ);
var tileFar = clustersUniform.near * pow(clustersUniform.far / clustersUniform.near, (f32(k) + 1.0) / clustersUniform.clusterTileZ);
var maxPointVs = ScreenToView(maxPointSs).xyz;
var minPointNear = LineIntersectionToZPlane(eyePos, minPointVs, tileNear);
var minPointFar = LineIntersectionToZPlane(eyePos, minPointVs, tileFar);
var maxPointNear = LineIntersectionToZPlane(eyePos, maxPointVs, tileNear);
var maxPointFar = LineIntersectionToZPlane(eyePos, maxPointVs, tileFar);
let f = (far / near) ;
var tileNear = near * pow(f, f32(k) / clustersUniform.clusterTileZ) ;
var tileFar = near * pow(f, f32(k + 1u) / clustersUniform.clusterTileZ) ;
var minPointAABB = min(min(minPointNear, minPointFar), min(maxPointNear, maxPointFar));
var maxPointAABB = max(max(minPointNear, minPointFar), max(maxPointNear, maxPointFar));
var minPointNear = LineIntersectionToZPlane(eyePos, minPointVs, tileNear );
var minPointFar = LineIntersectionToZPlane(eyePos, minPointVs, tileFar );
var maxPointNear = LineIntersectionToZPlane(eyePos, maxPointVs, tileNear );
var maxPointFar = LineIntersectionToZPlane(eyePos, maxPointVs, tileFar );
var minPointAABB = min(min(minPointNear, minPointFar),min(maxPointNear, maxPointFar));
var maxPointAABB = max(max(minPointNear, minPointFar),max(maxPointNear, maxPointFar));
var clusterBox : ClusterBox ;
clusterBox.minPoint = vec4<f32>(minPointAABB,f32(tileIndex)) ;
clusterBox.maxPoint = vec4<f32>(maxPointAABB,f32(tileIndex)) ;
clusterBuffer[tileIndex] = clusterBox;
clusterBox.minPoint = vec4<f32>(minPointAABB.xyz,f32(tileIndex)) ;
clusterBox.maxPoint = vec4<f32>(maxPointAABB.xyz,f32(tileIndex)) ;
clusterBuffer[tileIndex] = clusterBox;
}
`
5 changes: 5 additions & 0 deletions src/assets/shader/core/base/Common_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,12 @@ export let Common_frag: string = /*wgsl*/ `
debugFragmentOut();
#endif
var d1 = logDepth( ORI_VertexVarying.fragCoord.w , globalUniform.far);
ORI_FragmentOutput.out_depth = d1 ;
return ORI_FragmentOutput ;
}
`

2 changes: 1 addition & 1 deletion src/assets/shader/core/struct/ClusterLight.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export let ClusterLight: string = /*wgsl*/ `
fn getTile(fragCoord : vec4<f32>) -> vec3<u32> {
var coord = fragCoord ;
coord.z = linear01Depth(coord.z) ;
coord.z = ORI_VertexVarying.fragPosition.z ;
let sliceScale = f32(clustersUniform.clusterTileZ) / log2(globalUniform.far / globalUniform.near);
let sliceBias = -(f32(clustersUniform.clusterTileZ) * log2(globalUniform.near) / log2(globalUniform.far / globalUniform.near));
Expand Down
2 changes: 1 addition & 1 deletion src/assets/shader/core/struct/VertexAttributes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export let VertexAttributes: string = /*wgsl*/ `
ORI_VertexOut.varying_UV0 = vertex.uv.xy ;
ORI_VertexOut.varying_UV1 = vertex.TEXCOORD_1.xy;
ORI_VertexOut.varying_ViewPos = viewPosition / viewPosition.w;
ORI_VertexOut.varying_ViewPos = viewPosition ;
ORI_VertexOut.varying_Clip = clipPosition ;
ORI_VertexOut.varying_WPos = worldPos ;
ORI_VertexOut.varying_WPos.w = f32(vertex.index);
Expand Down
10 changes: 9 additions & 1 deletion src/assets/shader/graphic/Graphic3DShader_fs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ export let Graphic3DShader_fs: string = /*wgsl*/ `
// #endif
// #if USEGBUFFER
@location(2) worldNormal: vec4<f32>,
@location(3) material: vec4<f32>
@location(3) material: vec4<f32>,
// #endif
@builtin(frag_depth) out_depth: f32
};
@fragment
Expand All @@ -30,6 +31,13 @@ export let Graphic3DShader_fs: string = /*wgsl*/ `
// #endif
result.color = varying_Color;
// let n = globalUniform.near ;
// let f = globalUniform.far ;
// let z = ORI_VertexVarying.fragCoord.z ;
// let pt = pow((f / n),z);
// let ratio = n * pt / (f / n);
// result.out_depth = ratio ;
return result;
}
`
29 changes: 4 additions & 25 deletions src/assets/shader/lighting/BxDF_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export let BxDF_frag: string = /*wgsl*/ `
fragData.ClearcoatRoughness = materialUniform.clearcoatRoughnessFactor ;
#if USE_CLEARCOAT_ROUGHNESS
fragData.ClearcoatRoughness = getClearcoatRoughnees() * materialUniform.clearcoatRoughnessFactor;
fragData.ClearcoatRoughness = getClearcoatRoughness() * materialUniform.clearcoatRoughnessFactor;
#endif
}
Expand All @@ -55,13 +55,13 @@ export let BxDF_frag: string = /*wgsl*/ `
irradiance += getIrradiance().rgb ;
#else
let MAX_REFLECTION_LOD = f32(textureNumLevels(prefilterMap)) ;
// irradiance += LinearToGammaSpace(globalUniform.skyExposure * textureSampleLevel(prefilterMap, prefilterMapSampler, fragData.N.xyz, 0.8 * (MAX_REFLECTION_LOD) ).rgb);
irradiance += (globalUniform.skyExposure * textureSampleLevel(prefilterMap, prefilterMapSampler, fragData.N.xyz, 0.8 * (MAX_REFLECTION_LOD) ).rgb);
#endif
//***********lighting-PBR part*********
var specColor = vec3<f32>(0.0) ;
let lightIndex = getCluster(ORI_VertexVarying.fragCoord);
// let lightIndex = getCluster(ORI_VertexVarying.fragCoord);
let start = max(lightIndex.start, 0.0);
let count = max(lightIndex.count, 0.0);
let end = max(start + count , 0.0);
Expand Down Expand Up @@ -140,30 +140,9 @@ export let BxDF_frag: string = /*wgsl*/ `
#endif
ORI_FragmentOutput.color = vec4<f32>(LinearToGammaSpace(color.rgb),fragData.Albedo.a) ;
let n = globalUniform.near ;
let f = globalUniform.far ;
let z = ORI_VertexVarying.fragCoord.z ;
// ORI_FragmentOutput.color = vec4<f32>(fragData.Albedo.rgb,fragData.Albedo.a) ;
// clipPosition.w = LinearizeDepth(clipPosition.w,0.01, 5000.0) ;
//clustersUniform.near * pow(clustersUniform.far / clustersUniform.near, f32(k)
//(z - near) / (far - near);
ORI_FragmentOutput.out_depth = z * (z/f) ;
}
fn Linear02Depth(z:f32,near:f32,far:f32)-> f32{
let ZBufferZ = (-1.0+(far/near)) / far;
let ZBufferW = near /far ;
return 1.0 / (ZBufferZ * z + ZBufferW) ;
}
fn LinearizeDepth2( depth:f32 , nearPlane:f32 , farPlane:f32 )-> f32 {
var z = depth * 2.0 - 1.0;
return (2.0 * nearPlane * farPlane) / (farPlane + nearPlane - z * (farPlane - nearPlane));
}
}
// fn linear01Depth(depth : f32) -> f32 {
// return globalUniform.far * globalUniform.near / fma(depth, globalUniform.near-globalUniform.far, globalUniform.far);
// }
`

8 changes: 3 additions & 5 deletions src/assets/shader/lighting/LightingFunction_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ fn directLighting( albedo:vec3<f32>, N:vec3<f32>, V:vec3<f32>, roughness:f32 ,
}
#if USE_LAMBERT
color = vec3<f32>(1.0,0.5,1.0) ;
color = vec3<f32>(1.0,1.0,1.0) ;
#endif
#if USE_BRDF
color = simpleBRDF(albedo,N,V,L,att,lightColor,roughness,metallic) ;
#endif
#endif
return color ;
return color;
}
fn pointLighting( albedo:vec3<f32>,WP:vec3<f32>, N:vec3<f32>, V:vec3<f32>, roughness:f32 , metallic:f32 ,light:LightData ) -> vec3<f32> {
Expand Down Expand Up @@ -80,7 +80,7 @@ fn pointLighting( albedo:vec3<f32>,WP:vec3<f32>, N:vec3<f32>, V:vec3<f32>, rough
lightColor = getHDRColor(lightColor , light.linear ) ;
#if USE_LAMBERT
color = vec3<f32>(1.0,0.5,1.0) ;
color = vec3<f32>(1.0,1.0,1.0) ;
#endif
#if USE_BRDF
Expand Down Expand Up @@ -114,8 +114,6 @@ fn spotLighting( albedo:vec3<f32>,WP:vec3<f32>, N:vec3<f32>, V:vec3<f32>, roughn
if(angle < light.outerCutOff){
if(angle > light.innerCutOff){
atten *= 1.0 - smoothstep(light.innerCutOff, light.outerCutOff, angle) ;
}
}else{
atten = 0.0 ;
Expand Down
5 changes: 5 additions & 0 deletions src/assets/shader/materials/LambertShader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ export let LambertShader: string = /*wgsl*/ `
ORI_ShadingInput.BaseColor = lightColor * materialUniform.baseColor ;
ORI_ShadingInput.BaseColor.w = 1.0 ;
UnLit();
let n = globalUniform.near ;
let f = globalUniform.far ;
let z = ORI_VertexVarying.fragCoord.z ;
ORI_FragmentOutput.out_depth = z * (n/(f-n)) ;
}
`

4 changes: 2 additions & 2 deletions src/assets/shader/materials/program/Clearcoat_frag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ export let Clearcoat_frag: string = /*wgsl*/ `
@group(1) @binding(auto)
var clearCoatRoughnessMap: texture_2d<f32>;
fn getClearcoatRoughnees() -> f32{
fn getClearcoatRoughness() -> f32{
let clearcoatRoughness = textureSample(clearCoatRoughnessMap, clearCoatRoughnessMapSampler, ORI_VertexVarying.fragUV0.xy).r;
return clearcoatRoughness;
}
#else
fn getClearcoatRoughnees() -> f32{
fn getClearcoatRoughness() -> f32{
return 1.0;
}
#endif
Expand Down
4 changes: 4 additions & 0 deletions src/assets/shader/math/MathShader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,10 @@ fn dir_to_faceId(pt:vec3<f32>) -> i32 {
return (2.0 * nearPlane * farPlane) / (farPlane + nearPlane - z * (farPlane - nearPlane));
}
fn logDepth(depth : f32, far:f32) -> f32 {
return log2(depth + 1.0) * 2.0 / (log(far + 1.0) / 0.6931471805599453) * 0.5;
}
fn QuaternionToMatrix(q: vec4<f32>) -> mat4x4<f32> {
// If q is guaranteed to be a unit quaternion, s will always
// be 1. In that case, this calculation can be optimized out.
Expand Down
10 changes: 7 additions & 3 deletions src/gfx/renderJob/passRenderer/cluster/ClusterLightingRender.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { ILight } from '../../../../components/lights/ILight';
import { ClusterLightingBuffer } from './ClusterLightingBuffer';
import { ClusterBoundsSource_cs } from '../../../../assets/shader/cluster/ClusterBoundsSource_cs';
import { ClusterLighting_cs } from '../../../../assets/shader/cluster/ClusterLighting_cs';
import { Camera3D, Vector3, Vector4 } from '../../../..';
import { Camera3D, Color, Vector3, Vector4 } from '../../../..';
import { GUIHelp } from '@orillusion/debug/GUIHelp';
/**
* @internal
Expand Down Expand Up @@ -70,11 +70,15 @@ export class ClusterLightingRender extends RendererBase {
// let od = this.clusterLightingBuffer.clusterBuffer.readBuffer();
// console.log(od);
// let byteLength = 2 * 4;
// for (let i = 0; i < numClusters; i++) {
// for (let i = 0; i < 2; i++) {
// const element = new Float32Array(od.buffer, i * byteLength * 4, byteLength);
// let min = new Vector3(element[0], element[1], element[2], element[3]);
// let max = new Vector3(element[4], element[5], element[6], element[7]);
// view.graphic3D.drawBox(i + "-box", min, max);
// // mat.transformVector4(min, min)
// // mat.transformVector4(max, max)
// console.log(min.w, max.w);

// view.graphic3D.drawBox(i + "-box", min, max, Color.random());
// }
// });
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ export class Graphic3DFixedRenderPipeline {
'Graphic3DFixedRenderPipeline.vs',
Preprocessor.parse(Graphic3DShader_vs, {})
);

this.mFragmentShader = this.createShaderModule(
'Graphic3DFixedRenderPipeline.fs',
Preprocessor.parse(Graphic3DShader_fs, {})
Expand Down
1 change: 0 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,6 @@ export * from "./materials/GlassMaterial"
export * from "./materials/LambertMaterial"
export * from "./materials/LitMaterial"
export * from "./materials/Material"
export * from "./materials/MaterialPass"
export * from "./materials/MaterialRegister"
export * from "./materials/PhysicMaterial"
export * from "./materials/PointMaterial"
Expand Down
10 changes: 0 additions & 10 deletions src/materials/MaterialPass.ts

This file was deleted.

0 comments on commit 520b2bb

Please sign in to comment.