try different normal encoding
This commit is contained in:
parent
e67f4e8c62
commit
c2112d68aa
@ -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;"
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user