Skip to content
oculus_dk2.glsl 1.88 KiB
Newer Older
Martins Upitis's avatar
Martins Upitis committed
// Oculus DK2 lens distortion shader for single eye
// shader is adapted from Oculus DK1 distortion shader by
// Lubosz Sarnecki(lubosz.wordpress.com/)
Dalai Felinto's avatar
Dalai Felinto committed
uniform sampler2D bgl_RenderedTexture;
uniform float bgl_RenderedTextureWidth;
uniform float bgl_RenderedTextureHeight;

Martins Upitis's avatar
Martins Upitis committed
const vec4 kappa = vec4(1.0,0.9,1.0,2.0);
Dalai Felinto's avatar
Dalai Felinto committed

float screen_width = bgl_RenderedTextureWidth;
float screen_height = bgl_RenderedTextureHeight;

Martins Upitis's avatar
Martins Upitis committed
const float scaleFactor = 0.83;
Dalai Felinto's avatar
Dalai Felinto committed

Martins Upitis's avatar
Martins Upitis committed
const vec2 lensCenter = vec2(0.5, 0.5);
Dalai Felinto's avatar
Dalai Felinto committed

// Scales input texture coordinates for distortion.
Martins Upitis's avatar
Martins Upitis committed
vec2 hmdWarp(vec2 texCoord, vec2 Scale, vec2 ScaleIn, float eta) {
	vec2 theta = (texCoord - lensCenter) * ScaleIn;
	float rSq = theta.x * theta.x + theta.y * theta.y;
	vec2 rvector = theta * (kappa.x + kappa.y * rSq + kappa.z * rSq * rSq + kappa.w * rSq * rSq * rSq);
	vec2 tc = lensCenter + Scale * eta * rvector;
	return tc;
Dalai Felinto's avatar
Dalai Felinto committed
}

Martins Upitis's avatar
Martins Upitis committed
float edges(vec2 tc)
Dalai Felinto's avatar
Dalai Felinto committed
{
	float vertL = smoothstep(0.0,0.05,tc.x);
	float vertR = smoothstep(1.0,0.95,tc.x);
	float horizL = smoothstep(0.0,0.05,tc.y);
	float horizR = smoothstep(1.0,0.95,tc.y);
	return vertL*vertR*horizL*horizR;
Dalai Felinto's avatar
Dalai Felinto committed
}

Dalai Felinto's avatar
Dalai Felinto committed
void main()
{
	vec2 screen = vec2(screen_width, screen_height);
	vec3 eta = vec3(1.00,1.018,1.042); //refraction indices
Dalai Felinto's avatar
Dalai Felinto committed

	float as = float(screen.x) / float(screen.y);
	vec2 Scale = vec2(1.0, 1.0);
	vec2 ScaleIn = vec2(scaleFactor, scaleFactor);
	vec2 texCoord = gl_TexCoord[0].st;
Dalai Felinto's avatar
Dalai Felinto committed

	vec2 tcR = vec2(0.0);
	vec2 tcG = vec2(0.0);
	vec2 tcB = vec2(0.0);
Dalai Felinto's avatar
Dalai Felinto committed

	vec4 color = vec4(0.0);
Dalai Felinto's avatar
Dalai Felinto committed

	tcR = hmdWarp(texCoord, Scale, ScaleIn, eta.r );
	tcG = hmdWarp(texCoord, Scale, ScaleIn, eta.g );
	tcB = hmdWarp(texCoord, Scale, ScaleIn, eta.b );
	color.r = texture2D(bgl_RenderedTexture, tcR*vec2(0.5,1.0)+vec2(0.25,0.0)).r;
	color.g = texture2D(bgl_RenderedTexture, tcG*vec2(0.5,1.0)+vec2(0.25,0.0)).g;
	color.b = texture2D(bgl_RenderedTexture, tcB*vec2(0.5,1.0)+vec2(0.25,0.0)).b;
	color = color * edges(tcR);
Dalai Felinto's avatar
Dalai Felinto committed

	gl_FragColor = color;
Dalai Felinto's avatar
Dalai Felinto committed
}