[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