summaryrefslogtreecommitdiffstats
path: root/src/demos/hdr/shaders/cg/hdr.cg
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2005-05-27 19:45:51 +0000
committerKenneth Russel <[email protected]>2005-05-27 19:45:51 +0000
commit9d209d3b6ae12604e666d7b655bd1f19e70ee48b (patch)
tree5eb780835a316cbb62a9718a2757a3d51c31adb5 /src/demos/hdr/shaders/cg/hdr.cg
parent02acfb8e24959f43cada34366598236a51b782bb (diff)
Added Java/JOGL port of NVidia HDR demo.
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/jogl-demos/trunk@80 3298f667-5e0e-4b4a-8ed4-a3559d26a5f4
Diffstat (limited to 'src/demos/hdr/shaders/cg/hdr.cg')
-rwxr-xr-xsrc/demos/hdr/shaders/cg/hdr.cg130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/demos/hdr/shaders/cg/hdr.cg b/src/demos/hdr/shaders/cg/hdr.cg
new file mode 100755
index 0000000..3a0cafd
--- /dev/null
+++ b/src/demos/hdr/shaders/cg/hdr.cg
@@ -0,0 +1,130 @@
+/*
+ Cg functions to decode and filter textures in Radiance (RGBE) high dynamic range format
+ sgg 2/15/02
+
+ http://www.graphics.cornell.edu/~bjw/rgbe.html
+*/
+
+#if 0
+typedef float4 vec4;
+typedef float3 vec3;
+typedef float2 vec2;
+typedef float real;
+#define texRECT f4texRECT
+#define texCUBE f4texCUBE
+#else
+typedef half4 vec4;
+typedef half3 vec3;
+typedef half2 vec2;
+typedef half real;
+#define texRECT h4texRECT
+#define texCUBE h4texCUBE
+#endif
+
+struct fragin
+{
+ float4 wpos : WPOS;
+ float3 tex0 : TEXCOORD0;
+ float3 tex1 : TEXCOORD1;
+ float4 col0 : COLOR0;
+};
+
+// Lookup in RGBE-encoded rectangle texture
+vec3 texRECT_RGBE(uniform samplerRECT tex, float2 t)
+{
+ vec4 rgbe = texRECT(tex, t);
+ real e = (rgbe[3] * 255) - 128;
+ return rgbe.xyz * exp2(e);
+}
+
+// Lookup in RGBE-encoded cube map texture
+vec3 texCUBE_RGBE(uniform samplerCUBE tex, float3 t)
+{
+ vec4 rgbe = texCUBE(tex, t);
+ real e = (rgbe[3] * 255) - 128;
+ return rgbe.xyz * exp2(e);
+}
+
+// Lookup in RGBE-encoded rectangle texture with filtering
+vec3 texRECT_RGBE_Bilinear(uniform samplerRECT tex, half2 t)
+{
+ float2 f = frac(t);
+ vec3 t0 = texRECT_RGBE(tex, t);
+ vec3 t1 = texRECT_RGBE(tex, t + half2(1,0) );
+ vec3 t2 = lerp(t0, t1, f[0]);
+ t0 = texRECT_RGBE(tex, t + half2(0,1) );
+ t1 = texRECT_RGBE(tex, t + half2(1,1) );
+ t0 = lerp(t0, t1, f[0]);
+ t0 = lerp(t2, t0, f[1]);
+ return t0;
+}
+
+// Lookup in cubemap encoded as two HILO cube maps
+vec3 texCUBE_hilo(uniform samplerCUBE rg_tex : TEXUNIT0, uniform samplerCUBE b_tex : TEXUNIT1, float3 t)
+{
+ vec3 c;
+ c.xy = texCUBE(rg_tex, t).xy;
+ c.z = texCUBE(b_tex, t).x;
+// c = c * c;
+ return c;
+}
+
+// Lookup in rectangle texture encoded as two HILO cube maps
+vec3 texRECT_hilo(uniform samplerRECT rg_tex : TEXUNIT0, uniform samplerRECT b_tex : TEXUNIT1, float2 t)
+{
+ vec3 c;
+ c.xy = texRECT(rg_tex, t).xy;
+ c.z = texRECT(b_tex, t).x;
+ return c;
+}
+
+// bilinear lookup in float texture
+vec4 texRECT_bilinear(uniform samplerRECT tex, half2 t)
+{
+ float2 f = frac(t);
+ vec4 t0 = texRECT(tex, t);
+ vec4 t1 = texRECT(tex, t + half2(1,0) );
+ vec4 t2 = lerp(t0, t1, f[0]);
+ t0 = texRECT(tex, t + half2(0,1) );
+ t1 = texRECT(tex, t + half2(1,1) );
+ t0 = lerp(t0, t1, f[0]);
+ t0 = lerp(t2, t0, f[1]);
+ return t0;
+}
+
+// applying vignetting based on window coordinates
+void vignette(inout float3 c, float4 wpos, const float2 win_bias, const float2 win_scale)
+{
+ // convert window coord to [-1, 1] range
+ wpos.xy = (wpos.xy - win_bias) * win_scale;
+ // calculate distance from origin
+ float r = length(wpos.xy);
+ r = 1.0 - smoothstep(0.8, 1.5, r);
+ c = c * r;
+}
+
+// refraction function from Renderman spec
+// I = incident direction, N = normal, eta = relative index of refraction
+half3 my_refract(half3 I, half3 N, half eta)
+{
+ half IdotN = dot(I,N);
+ half k = 1 - eta*eta*(1 - IdotN*IdotN);
+
+ return eta*I - (eta*IdotN + sqrt(k))*N;
+}
+
+// fresnel approximation
+half my_fresnel(half3 I, half3 N, half power, half scale, half bias)
+{
+ return bias + (pow(max(0.0, 1.0 - dot(I, N)), power) * scale);
+}
+
+// transform a direction vector by a 4x4 matrix
+float3 transform_dir(float4x4 m, float3 v)
+{
+ float3 o;
+ o.x = dot(v, m._11_12_13);
+ o.y = dot(v, m._21_22_23);
+ o.z = dot(v, m._31_32_33);
+ return o;
+}