Browse Source

Added chroma aberration parameters to OculusRiftEffect.js

Luca Siciliano 12 năm trước cách đây
mục cha
commit
0c4eb0f622
1 tập tin đã thay đổi với 22 bổ sung12 xóa
  1. 22 12
      examples/js/effects/OculusRiftEffect.js

+ 22 - 12
examples/js/effects/OculusRiftEffect.js

@@ -20,7 +20,8 @@ THREE.OculusRiftEffect = function ( renderer, options ) {
 		interpupillaryDistance: 0.064,
 		lensSeparationDistance: 0.064,
 		eyeToScreenDistance: 0.041,
-		distortionK : [1.0, 0.22, 0.24, 0.0]
+		distortionK : [1.0, 0.22, 0.24, 0.0],
+		chromaAbParameter: [ 0.996, -0.004, 1.014, 0.0]
 	};
 
 	// Perspective camera
@@ -48,7 +49,8 @@ THREE.OculusRiftEffect = function ( renderer, options ) {
 			"scale": { type: "v2", value: new THREE.Vector2(1.0,1.0) },
 			"scaleIn": { type: "v2", value: new THREE.Vector2(1.0,1.0) },
 			"lensCenter": { type: "v2", value: new THREE.Vector2(0.0,0.0) },
-			"hmdWarpParam": { type: "v4", value: new THREE.Vector4(1.0,0.0,0.0,0.0) }
+			"hmdWarpParam": { type: "v4", value: new THREE.Vector4(1.0,0.0,0.0,0.0) },
+			"chromAbParam": { type: "v4", value: new THREE.Vector4(1.0,0.0,0.0,0.0) }
 		},
 		vertexShader: [
 			"varying vec2 vUv;",
@@ -59,10 +61,11 @@ THREE.OculusRiftEffect = function ( renderer, options ) {
 		].join("\n"),
 
 		fragmentShader: [
-		    "uniform vec2 scale;",
-		    "uniform vec2 scaleIn;",
-		    "uniform vec2 lensCenter;",
-		    "uniform vec4 hmdWarpParam;",
+			"uniform vec2 scale;",
+			"uniform vec2 scaleIn;",
+			"uniform vec2 lensCenter;",
+			"uniform vec4 hmdWarpParam;",
+			'uniform vec4 chromAbParam;',
 			"uniform sampler2D texid;",
 			"varying vec2 vUv;",
 			"void main()",
@@ -71,12 +74,18 @@ THREE.OculusRiftEffect = function ( renderer, options ) {
 			"  vec2 theta = (uv-lensCenter)*scaleIn;",
 			"  float rSq = theta.x*theta.x + theta.y*theta.y;",
 			"  vec2 rvector = theta*(hmdWarpParam.x + hmdWarpParam.y*rSq + hmdWarpParam.z*rSq*rSq + hmdWarpParam.w*rSq*rSq*rSq);",
-			"  vec2 tc = (lensCenter + scale * rvector);",
-			"  tc = (tc+1.0)/2.0;", // range from [-1,1] to [0,1]
-			"  if (any(bvec2(clamp(tc, vec2(0.0,0.0), vec2(1.0,1.0))-tc)))",
+			'  vec2 rBlue = rvector * (chromAbParam.z + chromAbParam.w * rSq);',
+			"  vec2 tcBlue = (lensCenter + scale * rBlue);",
+			"  tcBlue = (tcBlue+1.0)/2.0;", // range from [-1,1] to [0,1]
+			"  if (any(bvec2(clamp(tcBlue, vec2(0.0,0.0), vec2(1.0,1.0))-tcBlue))) {",
 			"    gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);",
-			"  else",
-			"    gl_FragColor = texture2D(texid, tc);",
+			"    return;}",
+			"  vec2 tcGreen = lensCenter + scale * rvector;",
+			"  tcGreen = (tcGreen+1.0)/2.0;", // range from [-1,1] to [0,1]
+			"  vec2 rRed = rvector * (chromAbParam.x + chromAbParam.y * rSq);",
+			"  vec2 tcRed = lensCenter + scale * rRed;",
+			"  tcRed = (tcRed+1.0)/2.0;", // range from [-1,1] to [0,1]
+			"  gl_FragColor = vec4(texture2D(texid, tcRed).r, texture2D(texid, tcGreen).g, texture2D(texid, tcBlue).b, 1);",
 			"}"
 		].join("\n")
 	} );
@@ -119,9 +128,10 @@ THREE.OculusRiftEffect = function ( renderer, options ) {
 		// Distortion shader parameters
 		var lensShift = 4 * (HMD.hScreenSize/4 - HMD.lensSeparationDistance/2) / HMD.hScreenSize;
 		left.lensCenter = new THREE.Vector2(lensShift, 0.0);
-		right.lensCenter = new THREE.Vector2(-lensShift, 0.0);    
+		right.lensCenter = new THREE.Vector2(-lensShift, 0.0);
 
 		RTMaterial.uniforms['hmdWarpParam'].value = new THREE.Vector4(HMD.distortionK[0], HMD.distortionK[1], HMD.distortionK[2], HMD.distortionK[3]);
+		RTMaterial.uniforms['chromAbParam'].value = new THREE.Vector4(HMD.chromaAbParameter[0], HMD.chromaAbParameter[1], HMD.chromaAbParameter[2], HMD.chromaAbParameter[3]);
 		RTMaterial.uniforms['scaleIn'].value = new THREE.Vector2(1.0,1.0/aspect);
 		RTMaterial.uniforms['scale'].value = new THREE.Vector2(1.0/distScale, 1.0*aspect/distScale);