Add local camera position uniform to fog material shaders

This commit is contained in:
2026-04-07 11:18:05 +02:00
parent 40a53801a7
commit cf48cabb11
2 changed files with 4 additions and 16 deletions

View File

@@ -13,6 +13,7 @@ export function createFogQualityMaterial(options) {
uniforms["volumePadding"] = { value: padding };
uniforms["opacityMultiplier"] = { value: Math.max(0.6, Math.min(1.5, options.opacityMultiplier ?? 1)) };
uniforms["colorLift"] = { value: Math.max(0, Math.min(0.22, options.colorLift ?? 0)) };
uniforms["localCameraPosition"] = { value: new Vector3() };
const vertexShader = /* glsl */ `
varying vec3 vLocalPosition;
#include <fog_pars_vertex>
@@ -33,6 +34,7 @@ export function createFogQualityMaterial(options) {
uniform float opacityMultiplier;
uniform float colorLift;
uniform float time;
uniform vec3 localCameraPosition;
varying vec3 vLocalPosition;
#include <fog_pars_fragment>
@@ -142,14 +144,6 @@ export function createFogQualityMaterial(options) {
}
void main() {
vec3 worldOrigin = (modelMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
mat3 localToWorld = mat3(modelMatrix);
vec3 worldCameraOffset = cameraPosition - worldOrigin;
vec3 localCameraPosition = vec3(
dot(worldCameraOffset, localToWorld[0]),
dot(worldCameraOffset, localToWorld[1]),
dot(worldCameraOffset, localToWorld[2])
);
vec3 rayDirection = normalize(vLocalPosition - localCameraPosition);
vec2 hitRange = intersectBox(localCameraPosition, rayDirection, volumeHalfSize);
float startDistance = max(hitRange.x, 0.0);

View File

@@ -39,6 +39,7 @@ export function createFogQualityMaterial(options: FogQualityMaterialOptions): Fo
uniforms["volumePadding"] = { value: padding };
uniforms["opacityMultiplier"] = { value: Math.max(0.6, Math.min(1.5, options.opacityMultiplier ?? 1)) };
uniforms["colorLift"] = { value: Math.max(0, Math.min(0.22, options.colorLift ?? 0)) };
uniforms["localCameraPosition"] = { value: new Vector3() };
const vertexShader = /* glsl */ `
varying vec3 vLocalPosition;
@@ -61,6 +62,7 @@ export function createFogQualityMaterial(options: FogQualityMaterialOptions): Fo
uniform float opacityMultiplier;
uniform float colorLift;
uniform float time;
uniform vec3 localCameraPosition;
varying vec3 vLocalPosition;
#include <fog_pars_fragment>
@@ -170,14 +172,6 @@ export function createFogQualityMaterial(options: FogQualityMaterialOptions): Fo
}
void main() {
vec3 worldOrigin = (modelMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
mat3 localToWorld = mat3(modelMatrix);
vec3 worldCameraOffset = cameraPosition - worldOrigin;
vec3 localCameraPosition = vec3(
dot(worldCameraOffset, localToWorld[0]),
dot(worldCameraOffset, localToWorld[1]),
dot(worldCameraOffset, localToWorld[2])
);
vec3 rayDirection = normalize(vLocalPosition - localCameraPosition);
vec2 hitRange = intersectBox(localCameraPosition, rayDirection, volumeHalfSize);
float startDistance = max(hitRange.x, 0.0);