GodotComponentTest/materials/shader/HexToTexture.gdshader

61 lines
1.6 KiB
Plaintext

shader_type spatial;
render_mode specular_schlick_ggx, async_visible;
uniform sampler2D MapAlbedoTexture : hint_black_albedo;
uniform int TextureSize: hint_range(0, 1024, 4);
uniform int CoordinateOffsetU: hint_range(-32000, 32000);
uniform int CoordinateOffsetV: hint_range(-32000, 32000);
varying vec2 map_coord;
const mat2 _HexAffineInverse = mat2(vec2(1.333333, -0.6666667), vec2(0, -1.154701));
vec3 axial_to_cube(vec2 axial) {
return vec3(axial.x, axial.y, -axial.x - axial.y);
}
ivec3 round_cube_coords(vec3 cube) {
ivec3 rounded = ivec3(round(cube));
vec3 diffs = abs(vec3(rounded) - cube);
if (diffs.x > diffs.y && diffs.x > diffs.z) {
rounded.x = -rounded.y - rounded.z;
} else if (diffs.y > diffs.z) {
rounded.y = -rounded.x - rounded.z;
} else {
rounded.z = -rounded.x - rounded.y;
}
return rounded;
}
vec2 axial_to_offset(vec2 axial) {
ivec3 cubeCoords = round_cube_coords(axial_to_cube(axial));
int x = cubeCoords.x;
int y = cubeCoords.y;
int off_y = y + (x - (x & 1)) / 2;
return vec2(float(x), float(off_y));
}
void vertex() {
mat4 model_matrix = WORLD_MATRIX;
vec3 origin = vec4(WORLD_MATRIX * vec4(0, 0, 0, 1)).xyz;
vec3 axial_coords = vec3(_HexAffineInverse * origin.xz, 0);
map_coord = axial_to_offset(axial_coords.xy) - vec2(ivec2(CoordinateOffsetU, CoordinateOffsetV));
}
void fragment() {
float size = float(TextureSize);
ivec2 texel_coord = ivec2(mod(map_coord.xy, vec2(size)));
vec4 texel_value = texelFetch(MapAlbedoTexture, texel_coord, 0);
ALBEDO = texelFetch(MapAlbedoTexture, texel_coord, 0).rgb;
}
void light() {
// Output:0
}