RetroArch/cores/libretro-ffmpeg/gl_shaders/fft_heightmap.glsl.vert.h
2016-09-03 17:36:47 +02:00

44 lines
1.3 KiB
C

#include "shaders_common.h"
static const char *fft_vertex_program_heightmap = GLSL_300(
layout(location = 0) in vec2 aVertex;
uniform sampler2D sHeight;
uniform mat4 uMVP;
uniform ivec2 uOffset;
uniform vec4 uHeightmapParams;
uniform float uAngleScale;
out vec3 vWorldPos;
out vec3 vHeight;
void main() {
vec2 tex_coord = vec2(aVertex.x + float(uOffset.x) + 0.5, -aVertex.y + float(uOffset.y) + 0.5) / vec2(textureSize(sHeight, 0));
vec3 world_pos = vec3(aVertex.x, 0.0, aVertex.y);
world_pos.xz += uHeightmapParams.xy;
float angle = world_pos.x * uAngleScale;
world_pos.xz *= uHeightmapParams.zw;
float lod = log2(world_pos.z + 1.0) - 6.0;
vec4 heights = textureLod(sHeight, tex_coord, lod);
float cangle = cos(angle);
float sangle = sin(angle);
int c = int(-sign(world_pos.x) + 1.0);
float height = mix(heights[c], heights[1], abs(angle) / 3.141592653);
height = height * 80.0 - 40.0;
vec3 up = vec3(-sangle, cangle, 0.0);
float base_y = 80.0 - 80.0 * cangle;
float base_x = 80.0 * sangle;
world_pos.xy = vec2(base_x, base_y);
world_pos += up * height;
vWorldPos = world_pos;
vHeight = vec3(height, heights.yw * 80.0 - 40.0);
gl_Position = uMVP * vec4(world_pos, 1.0);
}
);