[Bf-blender-cvs] [ef017ec9d0] HMD_viewport: Added support for correct Oculus DK1 and DK2 shaders with additional Generic shader (which could/should work for most other HMD's) Shaders can be changed in options so you can pick a shader that matches your device

Joey Ferwerda noreply at git.blender.org
Fri Feb 10 22:12:56 CET 2017


Commit: ef017ec9d032d04ee199e6755de021e9868dd92f
Author: Joey Ferwerda
Date:   Fri Feb 10 22:11:48 2017 +0100
Branches: HMD_viewport
https://developer.blender.org/rBef017ec9d032d04ee199e6755de021e9868dd92f

Added support for correct Oculus DK1 and DK2 shaders with additional Generic shader (which could/should work for most other HMD's)
Shaders can be changed in options so you can pick a shader that matches your device

===================================================================

M	source/blender/gpu/GPU_compositing.h
M	source/blender/gpu/intern/gpu_compositing.c
M	source/blender/gpu/intern/gpu_shader.c
M	source/blender/gpu/shaders/gpu_shader_fx_lensdistortion_frag.glsl
M	source/blender/makesdna/DNA_gpu_types.h
M	source/blender/makesrna/intern/rna_userdef.c

===================================================================

diff --git a/source/blender/gpu/GPU_compositing.h b/source/blender/gpu/GPU_compositing.h
index c358a8053d..3f24dbdd31 100644
--- a/source/blender/gpu/GPU_compositing.h
+++ b/source/blender/gpu/GPU_compositing.h
@@ -69,7 +69,9 @@ typedef enum GPUFXShaderEffect {
 	GPU_SHADER_FX_DEPTH_RESOLVE = 10,
 
 	/* lens distortion for HMD viewport use */
-	GPU_SHADER_FX_LENS_DISTORTION = 11,
+	GPU_SHADER_FX_LENS_DISTORTION = 11, //Generic Correction
+	GPU_SHADER_FX_LENS_DISTORTION_DK1 = 12, //Oculus DK1
+	GPU_SHADER_FX_LENS_DISTORTION_DK2 = 13, //Oculus DK2
 
 	GPU_MAX_SHADER, /* Always last! */
 } GPUFXShaderEffect;
diff --git a/source/blender/gpu/intern/gpu_compositing.c b/source/blender/gpu/intern/gpu_compositing.c
index d2aa70ba79..46120bcb2a 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -1295,10 +1295,21 @@ bool GPU_fx_do_composite_pass(
 
 	/* third pass, Lens Distortion */
 	if (fx->effects & GPU_FX_FLAG_LensDist) {
-		eGPULensDistType type = fx->settings.lensdist->type; /* TODO Use this */
-		GPUShader *lensdist_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_LENS_DISTORTION, is_persp);
-
-		UNUSED_VARS(type);
+		eGPULensDistType type = fx->settings.lensdist->type;
+		GPUShader *lensdist_shader = NULL;
+
+		switch(type) {
+			case GPU_FX_LENSDIST_DK1: 
+				lensdist_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_LENS_DISTORTION_DK1, is_persp); 
+				break;
+			case GPU_FX_LENSDIST_DK2: 
+				lensdist_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_LENS_DISTORTION_DK2, is_persp); 
+				break;
+			case GPU_FX_LENSDIST_GENERIC: 
+			default: lensdist_shader = 
+				GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_LENS_DISTORTION, is_persp); 
+				break;
+		}
 
 		if (lensdist_shader) {
 			const int color_uniform = GPU_shader_get_uniform(lensdist_shader, "warpTexture");
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index d1e227a2ce..bab2a64434 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -714,6 +714,14 @@ GPUShader *GPU_shader_get_builtin_fx_shader(int effect, bool persp)
 			case GPU_SHADER_FX_LENS_DISTORTION:
 				shader = GPU_shader_create(datatoc_gpu_shader_fx_lensdistortion_vert_glsl, datatoc_gpu_shader_fx_lensdistortion_frag_glsl, NULL, NULL, defines, 0, 0, 0);
 				break;
+			case GPU_SHADER_FX_LENS_DISTORTION_DK1:
+				strcat(defines, "#define DK1\n");
+				shader = GPU_shader_create(datatoc_gpu_shader_fx_lensdistortion_vert_glsl, datatoc_gpu_shader_fx_lensdistortion_frag_glsl, NULL, NULL, defines, 0, 0, 0);
+				break;
+			case GPU_SHADER_FX_LENS_DISTORTION_DK2:
+				strcat(defines, "#define DK2\n");
+				shader = GPU_shader_create(datatoc_gpu_shader_fx_lensdistortion_vert_glsl, datatoc_gpu_shader_fx_lensdistortion_frag_glsl, NULL, NULL, defines, 0, 0, 0);
+				break;
 		}
 
 		GG.shaders.fx_shaders[offset] = shader;
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_lensdistortion_frag.glsl b/source/blender/gpu/shaders/gpu_shader_fx_lensdistortion_frag.glsl
index 43a5740f59..0262549a2e 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_lensdistortion_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_lensdistortion_frag.glsl
@@ -1,6 +1,50 @@
 uniform ivec2 RegionSize;
 uniform sampler2D warpTexture;
 
+vec2 dk1HmdWarp(vec2 in01, vec2 LensCenter)
+{
+  const vec2 Scale = vec2(0.1469278, 0.2350845);
+  const vec2 ScaleIn = vec2(4, 2.5);
+  const vec4 HmdWarpParam   = vec4(1, 0.22, 0.24, 0);
+
+  vec2 theta = (in01 - LensCenter) * ScaleIn; // Scales to [-1, 1]
+  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);
+  return LensCenter + Scale * rvector;
+}
+
+void dk1()
+{
+  const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
+  const vec2 RightLensCenter = vec2(0.7136753, 0.5);
+  const vec2 LeftScreenCenter = vec2(0.25, 0.5);
+  const vec2 RightScreenCenter = vec2(0.75, 0.5);
+
+  vec2 LensCenter, ScreenCenter;
+
+  if (gl_FragCoord.x < 640) {
+    LensCenter =  LeftLensCenter;
+    ScreenCenter = LeftScreenCenter; 
+  } else {
+    LensCenter = RightLensCenter;
+    ScreenCenter = RightScreenCenter;
+  }
+
+  vec2 oTexCoord = gl_FragCoord.xy / vec2(1280, 800);
+
+  vec2 tc = dk1HmdWarp(oTexCoord, LensCenter);
+  if (any(bvec2(clamp(tc,ScreenCenter-vec2(0.25,0.5), ScreenCenter+vec2(0.25,0.5)) - tc)))
+  {
+    gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+    return;
+  }
+
+  tc.x = gl_FragCoord.x < 640 ? (2.0 * tc.x) : (2.0 * (tc.x - 0.5));
+  gl_FragColor = texture(warpTexture, vec2(tc.x, tc.y));
+}
+
 const vec2 LeftLensCenter = vec2(0.25, 0.5);
 const vec2 RightLensCenter = vec2(0.75, 0.5);
 const vec2 LeftScreenCenter = vec2(0.25, 0.5);
@@ -12,7 +56,8 @@ const vec4 HmdWarpParam = vec4(1, 0.2, 0.1, 0);
 const float aberr_r = 0.985;
 const float aberr_b = 1.015;
 
-void main()
+//TODO: Change with new OpenHMD DK2 shader
+void dk2()
 {
   // The following two variables need to be set per eye
   vec2 LensCenter = gl_FragCoord.x < RegionSize.x ? LeftLensCenter : RightLensCenter;
@@ -47,3 +92,48 @@ void main()
   gl_FragColor = vec4(rval,gval,bval,1.0);
 }
 
+void generic()
+{
+  // The following two variables need to be set per eye
+  vec2 LensCenter = gl_FragCoord.x < RegionSize.x ? LeftLensCenter : RightLensCenter;
+  vec2 ScreenCenter = gl_FragCoord.x < RegionSize.x ? LeftScreenCenter : RightScreenCenter;
+  vec2 oTexCoord = gl_FragCoord.xy / vec2(RegionSize.x*2, RegionSize.y);
+  oTexCoord = vec2(oTexCoord.x, 1.0 - oTexCoord.y);
+
+  vec2 theta = (oTexCoord - LensCenter) * ScaleIn; // Scales to [-1, 1]
+  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_r = LensCenter + aberr_r * Scale * rvector;
+  vec2 tc_g = LensCenter +           Scale * rvector;
+  vec2 tc_b = LensCenter + aberr_b * Scale * rvector;
+  tc_r.x = gl_FragCoord.x < RegionSize.x ? (2.0 * tc_r.x) : (2.0 * (tc_r.x - 0.5));
+  tc_g.x = gl_FragCoord.x < RegionSize.x ? (2.0 * tc_g.x) : (2.0 * (tc_g.x - 0.5));
+  tc_b.x = gl_FragCoord.x < RegionSize.x ? (2.0 * tc_b.x) : (2.0 * (tc_b.x - 0.5));
+
+  float rval = 0.0;
+  float gval = 0.0;
+  float bval = 0.0;
+
+  tc_r.y = (1-tc_r.y);
+  tc_g.y = (1-tc_g.y);
+  tc_b.y = (1-tc_b.y);
+
+  rval = texture2D(warpTexture, tc_r).x;
+  gval = texture2D(warpTexture, tc_g).y;
+  bval = texture2D(warpTexture, tc_b).z;
+
+  gl_FragColor = vec4(rval,gval,bval,1.0);
+}
+
+void main()
+{
+#ifdef DK1
+  dk1();
+#elif defined(DK2)
+  dk2();
+#else
+  generic();
+#endif
+}
\ No newline at end of file
diff --git a/source/blender/makesdna/DNA_gpu_types.h b/source/blender/makesdna/DNA_gpu_types.h
index 2c35a5628a..2dde4f7f21 100644
--- a/source/blender/makesdna/DNA_gpu_types.h
+++ b/source/blender/makesdna/DNA_gpu_types.h
@@ -59,7 +59,9 @@ typedef struct GPULensDistSettings {
 
 typedef enum eGPULensDistType {
 	GPU_FX_LENSDIST_NONE = 0,
-	GPU_FX_LENSDIST_DK2  = 1,
+	GPU_FX_LENSDIST_GENERIC  = 1,
+	GPU_FX_LENSDIST_DK1  = 2,
+	GPU_FX_LENSDIST_DK2  = 3,
 } eGPULensDistType;
 
 typedef struct GPUFXSettings {
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index aea285d984..5754e63d61 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -4075,8 +4075,10 @@ static void rna_def_userdef_system(BlenderRNA *brna)
 
 #ifdef WITH_INPUT_HMD
 	static EnumPropertyItem hmd_lensdist_type_items[] = {
-		{GPU_FX_LENSDIST_NONE, "NONE", 0, "None", "Don't use a lens distortion/correction shader for the HMD view"},
-		{GPU_FX_LENSDIST_DK2,  "DK2",  0, "DK2",  "Use a lens distortion/correction shader for the DK2"},
+		{GPU_FX_LENSDIST_NONE,		"NONE", 0, "None", "Don't use a lens distortion/correction shader for the HMD view"},
+		{GPU_FX_LENSDIST_GENERIC,	"GENERIC",  0, "Generic",  "Use a lens distortion/correction shader for Generic Use, might not be perfect or work at all"},
+		{GPU_FX_LENSDIST_DK1,  		"DK1",  0, "Oculus DK1",  "Use a lens distortion/correction shader for the Oculus DK1 (1280x800)"},
+		{GPU_FX_LENSDIST_DK2,  		"DK2",  0, "Oculus DK2/CV1",  "Use a lens distortion/correction shader for the Oculus DK2 (1080p) and CV1 (2160x1200)"},
 		{0, NULL, 0, NULL, NULL}
 	};
 #endif




More information about the Bf-blender-cvs mailing list