Implementando um shader de vértice de heightmap de 32 bits no threejs

Estou tentando redefinir o exemplo do shader heightmap encontradoaqui em um que funcione com precisão de 32 bits em vez de 8. O código do trabalho em andamento está no github:https://github.com/bgourlie/three_heightmap

O mapa de altura está sendo gerado no .NET. As alturas estão dentro de 0f ... 200f e convertidas em um valor de cor de 32 bits (o UnityEstrutura de cores) usando o seguinte método:

private static Color DepthToColor(float height)
{
    var depthBytes = BitConverter.GetBytes(height);
    int enc = BitConverter.ToInt32(depthBytes, 0);
    return new Color((enc >> 24 & 255)/255f, (enc >> 16 & 255)/255f, (enc >> 8 & 255)/255f,
            (enc & 255)/255f);
}

Os dados de cores são codificados como png, com o resultado parecido com o seguinte:

O sombreador de vértice está pegando esses dados da imagem e cobrindo os valores RBGA de volta ao valor original da altura (usando a técnica respondida na minha perguntaaqui):

uniform sampler2D bumpTexture; // defined in heightmap.js
varying float vAmount;
varying vec2 vUV;

void main()
{
  vUV = uv;
  vec4 bumpData = texture2D( bumpTexture, uv );
  vAmount = dot(bumpData, vec4(1.0, 255.0, 65025.0, 16581375.0));
  // Uncomment to see a "flatter" version
  //vAmount = dot(bumpData, vec4(1.0, 1.0/255.0, 1.0/65025.0, 1.0/160581375.0));

  // move the position along the normal
  vec3 newPosition = position + normal * vAmount;
  gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );
}

O resultado é definitivamente confuso:

Eu posso torná-lo mais plano, alterando esta linha:

vAmount = dot(bumpData, vec4(1.0, 1.0/255.0, 1.0/65025.0, 1.0/16581375.0));

Isso me dará uma imagem muito mais plana, que mostra pelo menos um belo esboço do terreno gerado, mas com um plano quase inteiramente plano (há uma variação leve, embora imperceptível):

Suponho que estou fazendo algumas coisas erradas, simplesmente não sei o quê. Não tenho certeza se estou codificando o float original corretamente. Não tenho certeza se estou decodificando corretamente no sombreador de vértices (o valor que estou obtendo certamente está fora do intervalo de 0 ... 200). Também não tenho muita experiência em gráficos 3D em geral. Portanto, qualquer sugestão sobre o que estou fazendo de errado ou geralmente sobre como conseguir isso seria muito apreciada.

Novamente, o código independente de trabalho em andamento pode ser encontrado aqui:https://github.com/bgourlie/three_heightmap

questionAnswers(2)

yourAnswerToTheQuestion