|
|
@@ -19,126 +19,39 @@ vec3 unpackNormal(in vec2 enc)
|
|
|
return normal;
|
|
|
}
|
|
|
|
|
|
-vec2 encodeUnormFloatToVec2(in float f)
|
|
|
-{
|
|
|
- vec2 vec = vec2(1.0, 65025.0) * f;
|
|
|
- return vec2(vec.x, fract(vec.y));
|
|
|
- //return unpackSnorm2x16(floatBitsToUint(f));
|
|
|
-}
|
|
|
-
|
|
|
-float decodeVec2ToUnormFloat(in vec2 vec)
|
|
|
+#if GL_ES
|
|
|
+uint packUnorm4x8(in vec4 v)
|
|
|
{
|
|
|
- //return uintBitsToFloat(packSnorm2x16(vec));
|
|
|
- return dot(vec, vec2(1.0, 1.0 / 65025.0));
|
|
|
+ vec4 a = clamp(v, 0.0, 1.0) * 255.0;
|
|
|
+ return uint(a.x) | (uint(a.y) << 8) | (uint(a.z) << 16) | (uint(a.w) << 24);
|
|
|
}
|
|
|
-
|
|
|
-void packAndWriteNormal(in vec3 normal, out vec4 fai)
|
|
|
+
|
|
|
+vec4 unpackUnorm4x8(in highp uint u)
|
|
|
{
|
|
|
-#if 1
|
|
|
- vec3 unorm = normal * 0.5 + 0.5;
|
|
|
- fai = vec4(unorm.xyz, 0.0);
|
|
|
-#endif
|
|
|
+ vec4 v;
|
|
|
+ v.x = float(u & 0xffU);
|
|
|
+ v.y = float((u >> 8) & 0xffU);
|
|
|
+ v.z = float((u >> 16) & 0xffU);
|
|
|
+ v.w = float((u >> 24) & 0xffU);
|
|
|
|
|
|
-#if 0
|
|
|
- vec3 unorm = normal * 0.5 + 0.5;
|
|
|
- float maxc = max(max(unorm.x, unorm.y), unorm.z);
|
|
|
- fai = vec4(unorm.xyz * maxc, maxc);
|
|
|
-#endif
|
|
|
-
|
|
|
-#if 0
|
|
|
- vec2 enc = packNormal(normal) * 0.5 + 0.5;
|
|
|
- fai = vec4(encodeUnormFloatToVec2(enc.x), encodeUnormFloatToVec2(enc.y));
|
|
|
-#endif
|
|
|
-
|
|
|
-#if 0
|
|
|
- vec2 unorm = normal.xy * 0.5 + 0.5;
|
|
|
- vec2 x = encodeUnormFloatToVec2(unorm.x);
|
|
|
- vec2 y = encodeUnormFloatToVec2(unorm.y);
|
|
|
- fai = vec4(x, y);
|
|
|
-#endif
|
|
|
- //fai = packNormal(normal_);
|
|
|
+ return v * (1.0 / 255.0);
|
|
|
}
|
|
|
-
|
|
|
-vec3 readAndUnpackNormal(in sampler2D fai, in vec2 texCoord)
|
|
|
-{
|
|
|
-#if 1
|
|
|
- return normalize(texture(fai, texCoord).xyz * 2.0 - 1.0);
|
|
|
-#endif
|
|
|
-
|
|
|
-#if 0
|
|
|
- vec4 enc = texture(fai, texCoord);
|
|
|
- return normalize(enc.xyz * (2.0 / enc.w) - 1.0);
|
|
|
-#endif
|
|
|
-
|
|
|
-#if 0
|
|
|
- vec4 enc = texture(fai, texCoord);
|
|
|
- vec2 enc2 = vec2(decodeVec2ToUnormFloat(enc.xy),
|
|
|
- decodeVec2ToUnormFloat(enc.zw)) * 2.0 - 1.0;
|
|
|
- return unpackNormal(enc2);
|
|
|
#endif
|
|
|
|
|
|
-#if 0
|
|
|
- vec4 enc = texture(fai, texCoord);
|
|
|
- vec2 xy = vec2(decodeVec2ToUnormFloat(enc.xy),
|
|
|
- decodeVec2ToUnormFloat(enc.zw)) * 2.0 - 1.0;
|
|
|
- float z = sqrt(1.0 - dot(xy, xy)) ;
|
|
|
- vec3 snorm = vec3(xy, z);
|
|
|
- return snorm;
|
|
|
+// If not defined fake it to stop some compilers from complaining
|
|
|
+#ifndef USE_MRT
|
|
|
+# define USE_MRT 1
|
|
|
#endif
|
|
|
- //unpackNormal(texture(fai_, texCoord_).rg)
|
|
|
-}
|
|
|
|
|
|
#define MAX_SPECULARITY 128.0
|
|
|
|
|
|
-/// Pack specular stuff
|
|
|
-/// @param c The specular component. c.x is the color in grayscale and c.y the
|
|
|
-/// specularity
|
|
|
-#define packSpecular_DEFINED
|
|
|
-float packSpecular(in vec2 c)
|
|
|
-{
|
|
|
- return round(c[0] * 15.0) * (16.0 / 255.0)
|
|
|
- + round(c[1] / MAX_SPECULARITY * 15.0) / 255.0;
|
|
|
-}
|
|
|
-
|
|
|
-/// Unpack specular
|
|
|
-vec2 unpackSpecular(in float f)
|
|
|
-{
|
|
|
- float r = floor(f * (255.0 / 16.0));
|
|
|
-
|
|
|
- return vec2(
|
|
|
- r / 15.0,
|
|
|
- f * (255.0 * MAX_SPECULARITY / 15.0)
|
|
|
- - r * (16.0 * MAX_SPECULARITY / 15.0));
|
|
|
-}
|
|
|
-
|
|
|
-#if GL_ES
|
|
|
-uint packUnorm4x8(in vec4 v)
|
|
|
-{
|
|
|
- vec4 value = clamp(v, 0.0, 1.0) * 255.0;
|
|
|
-
|
|
|
- return uint(value.x) | (uint(value.y) << 8) | (uint(value.z) << 16) |
|
|
|
- (uint(value.w) << 24);
|
|
|
-}
|
|
|
-
|
|
|
-vec4 unpackUnorm4x8(in uint u)
|
|
|
-{
|
|
|
- vec4 value;
|
|
|
-
|
|
|
- value.x = float(u & 0xffU);
|
|
|
- value.y = float((u >> 8) & 0xffU);
|
|
|
- value.z = float((u >> 16) & 0xffU);
|
|
|
- value.w = float((u >> 24) & 0xffU);
|
|
|
-
|
|
|
- return value * (1.0 / 255.0);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
// Populate the G buffer
|
|
|
void writeGBuffer(
|
|
|
in vec3 diffColor, in vec3 normal, in float specColor, in float specPower,
|
|
|
- out vec4 fai0
|
|
|
#if USE_MRT
|
|
|
- ,out vec4 fai1
|
|
|
+ out vec4 fai0, out vec4 fai1
|
|
|
+#else
|
|
|
+ out highp uvec2 fai0
|
|
|
#endif
|
|
|
)
|
|
|
{
|
|
|
@@ -172,15 +85,15 @@ void readGBuffer(
|
|
|
normal = normalize(comp.xyz * 2.0 - 1.0);
|
|
|
specPower = comp.w * MAX_SPECULARITY;
|
|
|
#else
|
|
|
- uvec2 all_ = texture(fai0, texCoord).rg;
|
|
|
+ highp uvec2 all_ = texture(fai0, texCoord).rg;
|
|
|
|
|
|
vec4 v = unpackUnorm4x8(all_[0]);
|
|
|
diffColor = v.rgb;
|
|
|
- specColor = v.a * MAX_SPECULARITY;
|
|
|
+ specColor = v.a;
|
|
|
|
|
|
v = unpackUnorm4x8(all_[1]);
|
|
|
normal = normalize(v.xyz * 2.0 - 1.0);
|
|
|
- specPower = v.xyz;
|
|
|
+ specPower = v.w * MAX_SPECULARITY;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -195,7 +108,7 @@ void readNormalFromGBuffer(
|
|
|
out vec3 normal)
|
|
|
{
|
|
|
#if USE_MRT
|
|
|
- normal = normalize(readAndUnpackNormal(fai1, texCoord).xyz);
|
|
|
+ normal = normalize(texture(fai1, texCoord).xyz);
|
|
|
#else
|
|
|
vec4 v = unpackUnorm4x8(texture(fai0, texCoord).g);
|
|
|
normal = normalize(v.xyz * 2.0 - 1.0);
|