aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorraysan5 <raysan5@gmail.com>2016-06-27 19:18:53 +0200
committerraysan5 <raysan5@gmail.com>2016-06-27 19:18:53 +0200
commit6fbf6a1c234ab7db9b975109c3c2138f83684442 (patch)
tree5aa8bd813e0061069a84d48a764af1086d6b0e3b /examples
parent5a4eb34c39e404fdd5804299111477a10dd3895d (diff)
downloadraylib-6fbf6a1c234ab7db9b975109c3c2138f83684442.tar.gz
raylib-6fbf6a1c234ab7db9b975109c3c2138f83684442.zip
Redesigned distortion shader, added chromatic aberration
Diffstat (limited to 'examples')
-rw-r--r--examples/resources/shaders/glsl100/distortion.fs51
-rw-r--r--examples/resources/shaders/glsl330/distortion.fs53
2 files changed, 53 insertions, 51 deletions
diff --git a/examples/resources/shaders/glsl100/distortion.fs b/examples/resources/shaders/glsl100/distortion.fs
index 19e6656a..d7b687bf 100644
--- a/examples/resources/shaders/glsl100/distortion.fs
+++ b/examples/resources/shaders/glsl100/distortion.fs
@@ -29,36 +29,37 @@ Right Screen Center = {0.75, 0.5, 0, 0}
Right Lens Center = {0.712005913, 0.5, 0, 0}
*/
-// Scales input texture coordinates for distortion.
-vec2 HmdWarp(vec2 in01, vec2 LensCenter)
-{
- 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 main()
{
- // SOURCE: http://www.mtbs3d.com/phpbb/viewtopic.php?f=140&t=17081
-
// The following two variables need to be set per eye
vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
- vec2 tc = HmdWarp(fragTexCoord, LensCenter);
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture2D(texture0, tcBlue).b;
- 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);
- else gl_FragColor = texture2D(texture0, tc);
-
- /*
- // Chromatic aberration is caused when a lens can't focus every color to the same focal point.
- // A simple way to fake this effect, and render it as a quick full-screen post-process,
- // is to apply an offset to each color channel in a fragment shader.
- vec4 rValue = texture2D(texture0, fragTexCoord - rOffset);
- vec4 gValue = texture2D(texture0, fragTexCoord - gOffset);
- vec4 bValue = texture2D(texture0, fragTexCoord - bOffset);
- finalColor = vec4(rValue.r, gValue.g, bValue.b, 1.0);
- */
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture2D(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture2D(texture0, tcRed).r;
+
+ gl_FragColor = vec4(red, green, blue, 1.0);
+ }
}
diff --git a/examples/resources/shaders/glsl330/distortion.fs b/examples/resources/shaders/glsl330/distortion.fs
index c8777c18..4cd9937f 100644
--- a/examples/resources/shaders/glsl330/distortion.fs
+++ b/examples/resources/shaders/glsl330/distortion.fs
@@ -17,7 +17,7 @@ const vec2 RightScreenCenter = vec2(0.75, 0.5);
const vec2 Scale = vec2(0.25, 0.45); //vec2(0.1469278, 0.2350845);
const vec2 ScaleIn = vec2(4, 2.2222);
const vec4 HmdWarpParam = vec4(1, 0.22, 0.24, 0);
-const vec4 ChromaAbCorrection = vec4(0.99599999, -0.0040000002, 1.0140001, 0.0);
+const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
/*
// Another set of default values
@@ -31,37 +31,38 @@ Right Screen Center = {0.75, 0.5, 0, 0}
Right Lens Center = {0.712005913, 0.5, 0, 0}
*/
-// Scales input texture coordinates for distortion.
-vec2 HmdWarp(vec2 in01, vec2 LensCenter)
-{
- 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 main()
{
- // SOURCE: http://www.mtbs3d.com/phpbb/viewtopic.php?f=140&t=17081
-
// The following two variables need to be set per eye
vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
- vec2 tc = HmdWarp(fragTexCoord, LensCenter);
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) finalColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture(texture0, tcBlue).b;
- if (any(bvec2(clamp(tc, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tc))) finalColor = vec4(0.0, 0.0, 0.0, 1.0);
- else finalColor = texture2D(texture0, tc);
-
- // Chromatic aberration is caused when a lens can't focus every color to the same focal point.
- // A simple way to fake this effect, and render it as a quick full-screen post-process,
- // is to apply an offset to each color channel in a fragment shader.
- /*
- vec4 rValue = texture2D(texture0, fragTexCoord - ChromaAbCorrection.x);
- vec4 gValue = texture2D(texture0, fragTexCoord - ChromaAbCorrection.y);
- vec4 bValue = texture2D(texture0, fragTexCoord - ChromaAbCorrection.z);
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture(texture0, tcRed).r;
- finalColor = vec4(rValue.r, gValue.g, bValue.b, 1.0);
- */
+ finalColor = vec4(red, green, blue, 1.0);
+ }
}
+