try different normal encoding

This commit is contained in:
Hannes Janetzek 2014-03-07 18:45:24 +01:00
parent e67f4e8c62
commit c2112d68aa
2 changed files with 46 additions and 9 deletions

View File

@ -544,18 +544,41 @@ public class ExtrusionRenderer extends LayerRenderer {
+ " color = u_color[3] * z;"
+ " } else {"
// normalize face x/y direction
+ " vec2 n = (a_light / 255.0 - 0.5) * 2.0;"
+ " vec2 enc = (a_light / 255.0);"
+ " vec2 fenc = enc * 4.0 - 2.0;"
+ " float f = dot(fenc, fenc);"
+ " float g = sqrt(1.0 - f / 4.0);"
+ " vec3 r_norm;"
+ " r_norm.xy = fenc * g;"
+ " r_norm.z = 1.0 - f / 2.0;"
// normal points up or down (1,-1)
+ " float dir = 1.0 - (2.0 * abs(mod(a_light.x,2.0)));"
////+ " float dir = 1.0 - (2.0 * abs(mod(a_light.x,2.0)));"
// recreate face normal vector
+ " vec3 r_norm = vec3(n.xy, dir * (1.0 - length(n.xy)));"
+ " vec3 light = normalize(vec3(-0.4,0.4,-1.0));"
///+ " vec3 r_norm = vec3(n.xy, dir * (1.0 - length(n.xy)));"
+ " vec3 light = normalize(vec3(-0.4,0.4,1.0));"
+ " float l = (1.0 + dot(r_norm, light)) / 2.0;"
+ " l = 0.4 + l * 0.6;"
+ " l = (l + (0.9 + clamp(a_pos.z / 4096.0, 0.0, 0.2))) / 2.0;"
/** ambient */
//+ " l = 0.2 + l * 0.8;"
/** fake-ssao by height */
+ " l = l + (clamp(a_pos.z / 8192.0, 0.0, 0.1) - 0.05);"
+ " color = vec4(l, l, l-0.02, 1.0);"
+ "}}}";
// vec3 decode(vec2 enc)
// {
// vec2 fenc = enc * 4.0 - 2.0;
// float f = dot(fenc, fenc);
// float g = sqrt(1.0 - f / 4.0);
//
// vec3 n;
// n.xy = fenc * g;
// n.z = 1.0 - f / 2.0;
// return n;
// }
final static String extrusionFragmentShader = ""
+ "precision mediump float;"
+ "varying vec4 color;"

View File

@ -156,9 +156,15 @@ public class ExtrusionLayer extends RenderElement {
double len = Math.sqrt(cx * cx + cy * cy + cz * cz);
// packing the normal in two bytes
int mx = FastMath.clamp(127 + (int) ((cx / len) * 128), 0, 0xff);
int my = FastMath.clamp(127 + (int) ((cy / len) * 128), 0, 0xff);
short normal = (short) ((my << 8) | (mx & NORMAL_DIR_MASK) | (cz > 0 ? 1 : 0));
//(cx / len) / p + 0.5
double p = Math.sqrt((cz / len) * 8.0 + 8.0);
int mx = FastMath.clamp(127 + (int) ((cx / len / p) * 128), 0, 255);
int my = FastMath.clamp(127 + (int) ((cy / len / p) * 128), 0, 255);
short normal = (short) ((my << 8) | mx);
// int mx = FastMath.clamp(127 + (int) ((cx / len) * 128), 0, 0xff);
// int my = FastMath.clamp(127 + (int) ((cy / len) * 128), 0, 0xff);
// short normal = (short) ((my << 8) | (mx & NORMAL_DIR_MASK) | (cz > 0 ? 1 : 0));
if (v == VertexItem.SIZE) {
mCurVertices.used = VertexItem.SIZE;
@ -193,6 +199,14 @@ public class ExtrusionLayer extends RenderElement {
mNumVertices += vertexCnt; //(vertexCnt / 3);
}
// private void encodeNormal(float v[], int offset) {
// var p = Math.sqrt(cartesian.z * 8.0 + 8.0);
// var result = new Cartesian2();
// result.x = cartesian.x / p + 0.5;
// result.y = cartesian.y / p + 0.5;
// return result;
// }
//
public void addNoNormal(MapElement element) {
if (element.type != GeometryType.TRIS)
return; //FIXME throw