소스 검색

Consolidate usage of vEyePosition

Popov72 4 년 전
부모
커밋
e8cc3bb624

+ 2 - 2
materialsLibrary/src/cell/cell.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 // Input
@@ -90,7 +90,7 @@ void main(void)
 {
 #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 2 - 2
materialsLibrary/src/fire/fire.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 
 // Input
 varying vec3 vPositionW;
@@ -41,7 +41,7 @@ void main(void) {
 	// Clip plane
 #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 2 - 2
materialsLibrary/src/fur/fur.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 // Input
@@ -54,7 +54,7 @@ void main(void) {
 	// Clip plane
 	#include<clipPlaneFragment>
 	
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = furColor;

+ 2 - 2
materialsLibrary/src/gradient/gradient.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 
 // Gradient variables
 uniform vec4 topColor;
@@ -43,7 +43,7 @@ varying vec4 vColor;
 void main(void) {
 #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
     float h = vPosition.y * scale + offset;
     float mysmoothness = clamp(smoothness, 0.01, max(smoothness, 10.));

+ 2 - 2
materialsLibrary/src/lava/lava.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 // Input
@@ -60,7 +60,7 @@ float random( vec3 scale, float seed ){
 void main(void) {
 #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 2 - 2
materialsLibrary/src/mix/mix.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 #ifdef SPECULARTERM
@@ -71,7 +71,7 @@ void main(void) {
 	// Clip plane
 	#include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 finalMixColor = vec4(1., 1., 1., 1.);

+ 2 - 2
materialsLibrary/src/normal/normal.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 // Input
@@ -41,7 +41,7 @@ uniform vec2 vDiffuseInfos;
 void main(void) {
 #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 2 - 2
materialsLibrary/src/shadowOnly/shadowOnly.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform float alpha;
 uniform vec3 shadowColor;
 
@@ -29,7 +29,7 @@ varying vec3 vNormalW;
 void main(void) {
 #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Normal
 #ifdef NORMAL

+ 2 - 2
materialsLibrary/src/simple/simple.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 // Input
@@ -39,7 +39,7 @@ uniform vec2 vDiffuseInfos;
 void main(void) {
 #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 2 - 2
materialsLibrary/src/terrain/terrain.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 #ifdef SPECULARTERM
@@ -99,7 +99,7 @@ void main(void) {
 	// Clip plane
 	#include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 2 - 2
materialsLibrary/src/triPlanar/triplanar.fragment.fx

@@ -1,7 +1,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 #ifdef SPECULARTERM
@@ -59,7 +59,7 @@ void main(void) {
 	// Clip plane
 	#include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(0., 0., 0., 1.);

+ 2 - 2
materialsLibrary/src/water/water.fragment.fx

@@ -5,7 +5,7 @@
 precision highp float;
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 uniform vec4 vDiffuseColor;
 
 #ifdef SPECULARTERM
@@ -78,7 +78,7 @@ void main(void) {
 	// Clip plane
     #include<clipPlaneFragment>
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 1 - 1
src/Materials/Node/Blocks/Input/inputBlock.ts

@@ -563,7 +563,7 @@ export class InputBlock extends NodeMaterialBlock {
                     effect.setMatrix(variableName, scene.getTransformMatrix());
                     break;
                 case NodeMaterialSystemValues.CameraPosition:
-                    MaterialHelper.BindEyePosition(effect, scene, variableName);
+                    MaterialHelper.BindEyePosition(effect, scene, variableName, true);
                     break;
                 case NodeMaterialSystemValues.FogColor:
                     effect.setColor3(variableName, scene.fogColor);

+ 3 - 1
src/Materials/PBR/pbrBaseMaterial.ts

@@ -1254,7 +1254,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
 
         var shaderName = "pbr";
 
-        var uniforms = ["world", "view", "viewProjection", "vLightsType", "vAmbientColor", "vAlbedoColor", "vReflectivityColor", "vMetallicReflectanceFactors", "vEmissiveColor", "visibility", "vReflectionColor",
+        var uniforms = ["world", "view", "viewProjection", "vEyePosition", "vLightsType", "vAmbientColor", "vAlbedoColor", "vReflectivityColor", "vMetallicReflectanceFactors", "vEmissiveColor", "visibility", "vReflectionColor",
             "vFogInfos", "vFogColor", "pointSize",
             "vAlbedoInfos", "vAmbientInfos", "vOpacityInfos", "vReflectionInfos", "vReflectionPosition", "vReflectionSize", "vEmissiveInfos", "vReflectivityInfos", "vReflectionFilteringInfo", "vMetallicReflectanceInfos",
             "vMicroSurfaceSamplerInfos", "vBumpInfos", "vLightmapInfos",
@@ -2050,6 +2050,8 @@ export abstract class PBRBaseMaterial extends PushMaterial {
 
             // Clip plane
             MaterialHelper.BindClipPlane(this._activeEffect, scene);
+
+            this.bindEyePosition(effect);
         }
 
         if (mustRebind || !this.isFrozen) {

+ 27 - 11
src/Materials/material.ts

@@ -20,6 +20,7 @@ import { Logger } from "../Misc/logger";
 import { IInspectable } from '../Misc/iInspectable';
 import { Plane } from '../Maths/math.plane';
 import { ShadowDepthWrapper } from './shadowDepthWrapper';
+import { MaterialHelper } from './materialHelper';
 
 declare type PrePassRenderer = import("../Rendering/prePassRenderer").PrePassRenderer;
 declare type Mesh = import("../Meshes/mesh").Mesh;
@@ -620,7 +621,7 @@ export class Material implements IAnimatable {
      * Stores a reference to the scene
      */
     private _scene: Scene;
-    private _needToFinalizeSceneUbo: boolean;
+    private _needToBindSceneUbo: boolean;
 
     /**
      * Stores the fill mode state
@@ -943,21 +944,33 @@ export class Material implements IAnimatable {
         if (!this._useUBO) {
             effect.setMatrix("view", this.getScene().getViewMatrix());
         } else {
-            this._needToFinalizeSceneUbo = true;
-            this.bindSceneUniformBuffer(effect, this.getScene().getSceneUniformBuffer());
+            this._needToBindSceneUbo = true;
         }
     }
 
     /**
-     * Binds the view projection matrix to the effect
-     * @param effect defines the effect to bind the view projection matrix to
+     * Binds the view projection and projection matrices to the effect
+     * @param effect defines the effect to bind the view projection and projection matrices to
      */
     public bindViewProjection(effect: Effect): void {
         if (!this._useUBO) {
             effect.setMatrix("viewProjection", this.getScene().getTransformMatrix());
+            effect.setMatrix("projection", this.getScene().getProjectionMatrix());
         } else {
-            this._needToFinalizeSceneUbo = true;
-            this.bindSceneUniformBuffer(effect, this.getScene().getSceneUniformBuffer());
+            this._needToBindSceneUbo = true;
+        }
+    }
+
+    /**
+     * Binds the view matrix to the effect
+     * @param effect defines the effect to bind the view matrix to
+     * @param variableName name of the shader variable that will hold the eye position
+     */
+    public bindEyePosition(effect: Effect, variableName?: string): void {
+        if (!this._useUBO) {
+            MaterialHelper.BindEyePosition(effect, this._scene, variableName);
+        } else {
+            this._needToBindSceneUbo = true;
         }
     }
 
@@ -965,11 +978,14 @@ export class Material implements IAnimatable {
      * Processes to execute after binding the material to a mesh
      * @param mesh defines the rendered mesh
      */
-    protected _afterBind(mesh?: Mesh): void {
+    protected _afterBind(mesh?: Mesh, effect: Nullable<Effect> = null): void {
         this._scene._cachedMaterial = this;
-        if (this._needToFinalizeSceneUbo) {
-            this._needToFinalizeSceneUbo = false;
-            this.getScene().finalizeSceneUbo();
+        if (this._needToBindSceneUbo) {
+            if (effect) {
+                this._needToBindSceneUbo = false;
+                this.getScene().finalizeSceneUbo();
+                this.bindSceneUniformBuffer(effect, this.getScene().getSceneUniformBuffer());
+            }
         }
         if (mesh) {
             this._scene._cachedVisibility = mesh.visibility;

+ 21 - 10
src/Materials/materialHelper.ts

@@ -19,6 +19,7 @@ import { MaterialDefines } from "./materialDefines";
 import { Color3 } from '../Maths/math.color';
 import { EffectFallbacks } from './effectFallbacks';
 import { ThinMaterialHelper } from './thinMaterialHelper';
+import { TmpVectors, Vector4 } from '../Maths/math.vector';
 
 /**
  * "Static Class" containing the most commonly used helper while dealing with material for rendering purpose.
@@ -34,18 +35,28 @@ export class MaterialHelper {
      * @param effect The effect to be bound
      * @param scene The scene the eyes position is used from
      * @param variableName name of the shader variable that will hold the eye position
+     * @isVector3 true to indicates that variableName is a Vector3 and not a Vector4
+     * @return the computed eye position
      */
-    public static BindEyePosition(effect: Effect, scene: Scene, variableName = "vEyePosition"): void {
-        if (scene._forcedViewPosition) {
-            effect.setVector3(variableName, scene._forcedViewPosition);
-            return;
-        }
-        var globalPosition = scene.activeCamera!.globalPosition;
-        if (!globalPosition) {
-            // Use WebVRFreecamera's device position as global position is not it's actual position in babylon space
-            globalPosition = (scene.activeCamera! as WebVRFreeCamera).devicePosition;
+    public static BindEyePosition(effect: Nullable<Effect>, scene: Scene, variableName = "vEyePosition", isVector3 = false): Vector4 {
+        const eyePosition =
+            scene._forcedViewPosition ? scene._forcedViewPosition :
+            scene._mirroredCameraPosition ? scene._mirroredCameraPosition :
+            scene.activeCamera!.globalPosition ?? (scene.activeCamera as WebVRFreeCamera).devicePosition;
+
+        const invertNormal = (scene.useRightHandedSystem === (scene._mirroredCameraPosition != null));
+
+        TmpVectors.Vector4[0].set(eyePosition.x, eyePosition.y, eyePosition.z, invertNormal ? -1 : 1);
+
+        if (effect) {
+            if (isVector3) {
+                effect.setFloat3(variableName, TmpVectors.Vector4[0].x, TmpVectors.Vector4[0].y, TmpVectors.Vector4[0].z);
+            } else {
+                effect.setVector4(variableName, TmpVectors.Vector4[0]);
+            }
         }
-        effect.setVector3(variableName, scene._mirroredCameraPosition ? scene._mirroredCameraPosition : globalPosition);
+
+        return TmpVectors.Vector4[0];
     }
 
     /**

+ 1 - 1
src/Materials/pushMaterial.ts

@@ -75,7 +75,7 @@ export class PushMaterial extends Material {
     }
 
     protected _afterBind(mesh: Mesh, effect: Nullable<Effect> = null): void {
-        super._afterBind(mesh);
+        super._afterBind(mesh, effect);
         this.getScene()._cachedEffect = effect;
     }
 

+ 4 - 4
src/Materials/shaderMaterial.ts

@@ -812,13 +812,13 @@ export class ShaderMaterial extends Material {
         const seffect = this._effect;
 
         this._effect = effect; // make sure the active effect is the right one if there are some observers for onBind that would need to get the current effect
-        this._afterBind(mesh);
+        this._afterBind(mesh, effect);
         this._effect = seffect;
     }
 
-    protected _afterBind(mesh?: Mesh): void {
-        super._afterBind(mesh);
-        this.getScene()._cachedEffect = this._effect;
+    protected _afterBind(mesh?: Mesh, effect: Nullable<Effect> = null): void {
+        super._afterBind(mesh, effect);
+        this.getScene()._cachedEffect = effect;
     }
 
     /**

+ 2 - 1
src/Materials/standardMaterial.ts

@@ -1566,7 +1566,8 @@ export class StandardMaterial extends PushMaterial {
             // Colors
             scene.ambientColor.multiplyToRef(this.ambientColor, this._globalAmbientColor);
 
-            MaterialHelper.BindEyePosition(effect, scene);
+            this.bindEyePosition(effect);
+
             effect.setColor3("vAmbientColor", this._globalAmbientColor);
         }
 

+ 2 - 0
src/Shaders/ShadersInclude/defaultFragmentDeclaration.fx

@@ -1,3 +1,5 @@
+uniform vec4 vEyePosition;
+
 uniform vec4 vDiffuseColor;
 #ifdef SPECULARTERM
 uniform vec4 vSpecularColor;

+ 1 - 1
src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx

@@ -1,4 +1,4 @@
-uniform vec4 viewPosition;
+uniform vec4 vEyePosition;
 
 uniform vec3 vReflectionColor;
 uniform vec4 vAlbedoColor;

+ 1 - 1
src/Shaders/ShadersInclude/sceneUboDeclaration.fx

@@ -7,6 +7,6 @@ uniform Scene {
 #endif 
 	mat4 view;
 	mat4 projection;
-    vec4 viewPosition;
+    vec4 vEyePosition;
 };
 

+ 4 - 4
src/Shaders/background.fragment.fx

@@ -9,7 +9,7 @@ precision highp float;
 #define RECIPROCAL_PI2 0.15915494
 
 // Constants
-uniform vec3 vEyePosition;
+uniform vec4 vEyePosition;
 
 // Input
 varying vec3 vPositionW;
@@ -114,7 +114,7 @@ varying vec3 vNormalW;
 void main(void) {
 #include<clipPlaneFragment>
 
-    vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+    vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 // _____________________________ Normal Information ______________________________
 #ifdef NORMAL
@@ -248,7 +248,7 @@ void main(void) {
         vec3 reflectionAmount = vReflectionControl.xxx;
         vec3 reflectionReflectance0 = vReflectionControl.yyy;
         vec3 reflectionReflectance90 = vReflectionControl.zzz;
-        float VdotN = dot(normalize(vEyePosition), normalW);
+        float VdotN = dot(normalize(vEyePosition.xyz), normalW);
 
         vec3 planarReflectionFresnel = fresnelSchlickEnvironmentGGX(saturate(VdotN), reflectionReflectance0, reflectionReflectance90, 1.0);
         reflectionAmount *= planarReflectionFresnel;
@@ -263,7 +263,7 @@ void main(void) {
     #endif
 
     #ifdef OPACITYFRESNEL
-        float viewAngleToFloor = dot(normalW, normalize(vEyePosition - vBackgroundCenter));
+        float viewAngleToFloor = dot(normalW, normalize(vEyePosition.xyz - vBackgroundCenter));
 
         // Fade out the floor plane as the angle between the floor and the camera tends to 0 (starting from startAngle)
         const float startAngle = 0.1;

+ 1 - 2
src/Shaders/default.fragment.fx

@@ -15,7 +15,6 @@
 // Constants
 #define RECIPROCAL_PI2 0.15915494
 
-uniform vec3 vEyePosition;
 uniform vec3 vAmbientColor;
 
 // Input
@@ -171,7 +170,7 @@ void main(void) {
 
 
 
-	vec3 viewDirectionW = normalize(vEyePosition - vPositionW);
+	vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
 
 	// Base color
 	vec4 baseColor = vec4(1., 1., 1., 1.);

+ 0 - 3
src/Shaders/pbr.fragment.fx

@@ -24,9 +24,6 @@ precision highp float;
 // Declaration
 #include<__decl__pbrFragment>
 
-// TODO WEBGPU Probably create a camera ubo
-#define vEyePosition viewPosition
-
 #include<pbrFragmentExtraDeclaration>
 #include<__decl__lightFragment>[0..maxSimultaneousLights]
 #include<pbrFragmentSamplersDeclaration>

+ 5 - 5
src/scene.ts

@@ -55,6 +55,7 @@ import { Frustum } from './Maths/math.frustum';
 import { UniqueIdGenerator } from './Misc/uniqueIdGenerator';
 import { FileTools, LoadFileError, RequestFileError, ReadFileError } from './Misc/fileTools';
 import { IClipPlanesHolder } from './Misc/interfaces/iClipPlanesHolder';
+import { MaterialHelper } from './Materials/materialHelper';
 
 declare type Ray = import("./Culling/ray").Ray;
 declare type TrianglePickingPredicate = import("./Culling/ray").TrianglePickingPredicate;
@@ -1660,7 +1661,7 @@ export class Scene extends AbstractScene implements IAnimatable, IClipPlanesHold
         this._sceneUbo.addUniform("viewProjection", 16);
         this._sceneUbo.addUniform("view", 16);
         this._sceneUbo.addUniform("projection", 16);
-        this._sceneUbo.addUniform("viewPosition", 4);
+        this._sceneUbo.addUniform("vEyePosition", 4);
     }
 
     /**
@@ -2037,13 +2038,12 @@ export class Scene extends AbstractScene implements IAnimatable, IClipPlanesHold
      */
     public finalizeSceneUbo(): UniformBuffer {
         const ubo = this.getSceneUniformBuffer();
-        const eyePosition = this._forcedViewPosition ? this._forcedViewPosition : (this._mirroredCameraPosition ? this._mirroredCameraPosition : (this.activeCamera!).globalPosition);
-        const invertNormal = (this.useRightHandedSystem === (this._mirroredCameraPosition != null));
-        ubo.updateFloat4("viewPosition",
+        const eyePosition = MaterialHelper.BindEyePosition(null, this);
+        ubo.updateFloat4("vEyePosition",
             eyePosition.x,
             eyePosition.y,
             eyePosition.z,
-            invertNormal ? -1 : 1);
+            eyePosition.w);
 
         ubo.update();