minecraft: terrain textures

This commit is contained in:
Zack Buhman 2026-03-04 04:28:59 +00:00
parent 8bc64d418a
commit e90126333e
5 changed files with 100 additions and 43 deletions

View File

@ -16,13 +16,15 @@ local cube_indices = {
6, 20, 7, 6, 20, 7,
9, 21, 10, 9, 21, 10,
12, 22, 13, 12, 22, 13,
15, 23, 16 15, 23, 16,
} }
local cube_indices_count = #cube_indices local cube_indices_count = #cube_indices
local cube_index_buffer local cube_index_buffer
local blocks local blocks
local shader_minecraft local shader_minecraft
local region_buffers = {} local region_buffers
local terrain_texture
local block_id_to_texture_id_buffer
local load_blocks_buffer = function(name) local load_blocks_buffer = function(name)
local data = love.filesystem.newFileData(name) local data = love.filesystem.newFileData(name)
@ -43,6 +45,15 @@ local load_region_buffer = function(path)
return buffer return buffer
end end
local load_block_id_to_texture_id_buffer = function()
local data = love.filesystem.newFileData("minecraft/block_id_to_texture_id.data")
local format = {
{ format = "uint8vec4" },
}
local buffer = love.graphics.newBuffer(format, data, { shaderstorage = true, usage = "static" })
return buffer
end
local load_cube_index_buffer = function() local load_cube_index_buffer = function()
local data = love.data.newByteData(cube_indices_count * 4) local data = love.data.newByteData(cube_indices_count * 4)
local ptr = ffi.cast("uint32_t*", data:getFFIPointer()) local ptr = ffi.cast("uint32_t*", data:getFFIPointer())
@ -60,13 +71,23 @@ local load_minecraft_shader = function()
return shader return shader
end end
local load_terrain_texture = function()
local image_data = love.image.newImageData("minecraft/terrain.png")
local texture = love.graphics.newTexture(image_data)
return texture
end
local init = function() local init = function()
table.insert(region_buffers, load_region_buffer("minecraft/region.0.0.data")) region_buffers = {
table.insert(region_buffers, load_region_buffer("minecraft/region.-1.0.data")) load_region_buffer("minecraft/region.0.0.data"),
table.insert(region_buffers, load_region_buffer("minecraft/region.0.-1.data")) load_region_buffer("minecraft/region.-1.0.data"),
table.insert(region_buffers, load_region_buffer("minecraft/region.-1.-1.data")) load_region_buffer("minecraft/region.0.-1.data"),
load_region_buffer("minecraft/region.-1.-1.data"),
}
terrain_texture = load_terrain_texture()
cube_index_buffer = load_cube_index_buffer() cube_index_buffer = load_cube_index_buffer()
shader_minecraft = load_minecraft_shader() shader_minecraft = load_minecraft_shader()
block_id_to_texture_id_buffer = load_block_id_to_texture_id_buffer()
end end
local viewpos = { local viewpos = {
@ -91,9 +112,12 @@ local draw = function(projection)
local view_projection = view * projection local view_projection = view * projection
shader_minecraft:send("terrain_sampler", terrain_texture)
shader_minecraft:send("TexturesLayout", block_id_to_texture_id_buffer)
shader_minecraft:send("transform", "column", view_projection:data())
for _, region_buffer in ipairs(region_buffers) do for _, region_buffer in ipairs(region_buffers) do
local instance_count = math.floor(region_buffer:getSize() / (4 * 2)) local instance_count = math.floor(region_buffer:getSize() / (4 * 2))
shader_minecraft:send("transform", "column", view_projection:data())
shader_minecraft:send("BlocksLayout", region_buffer) shader_minecraft:send("BlocksLayout", region_buffer)
love.graphics.drawFromShader(cube_index_buffer, cube_indices_count, instance_count, 1) love.graphics.drawFromShader(cube_index_buffer, cube_indices_count, instance_count, 1)
end end

Binary file not shown.

BIN
minecraft/terrain.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -1,22 +1,48 @@
#pragma language glsl4 #pragma language glsl4
in vec3 PixelNormal; in vec3 PixelNormal;
in vec3 PixelColor; //in vec3 PixelColor;
in vec2 PixelTexture;
in float PixelBlock; in float PixelBlock;
uniform sampler2D terrain_sampler;
out vec4 out_color; out vec4 out_color;
layout (std430) readonly buffer TexturesLayout
{
uint Textures[];
};
void pixelmain() void pixelmain()
{ {
if (PixelBlock == 0) { vec3 light_direction = normalize(vec3(-1, -0.5, 0.5));
float diffuse_intensity = max(dot(PixelNormal, light_direction), 0.0);
//vec3 color = PixelColor * diffuse_intensity;
//int t_ix = int(PixelBlock) / 4;
//int t_shift = (int(PixelBlock) % 4) * 8;
//int terrain_ix = int(Textures[t_ix] >> t_shift);
int terrain_ix = int(Textures[int(PixelBlock)]);
int terrain_x = terrain_ix % 16;
int terrain_y = terrain_ix / 16;
ivec2 coord = ivec2(terrain_x, terrain_y) * 16;
coord += ivec2(int(PixelTexture.x * 16.0), int(PixelTexture.y * 16.0));
vec4 texture_color = texelFetch(terrain_sampler, coord, 0);
if (texture_color.w != 1.0) {
discard; discard;
return; return;
} }
vec3 light_direction = normalize(vec3(-1, -0.5, 0.5)); if (int(PixelBlock) == 18) // leaves
float diffuse_intensity = max(dot(PixelNormal, light_direction), 0.0); texture_color.xyz *= vec3(0.125, 0.494, 0.027);
vec3 color = PixelColor * diffuse_intensity;
out_color = vec4(color, 1.0);
//out_color = vec4(color, 1.0);
out_color = vec4((texture_color * diffuse_intensity).xyz, 1.0);
//out_color = vec4(diffuse_intensity);
} }

View File

@ -1,39 +1,43 @@
#pragma language glsl4 #pragma language glsl4
struct vertex_t { struct vertex_t {
vec3 position; vec3 Position;
vec3 normal; vec3 Normal;
vec2 Texture;
}; };
vertex_t vertices[] = vertex_t[](vertex_t(vec3(-1.0, 1.0, -1.0), vec3(0.0, 1.0, 0.0)), vertex_t vertices[] = vertex_t[](
vertex_t(vec3(1.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0)), vertex_t(vec3(-1.0, 1.0, -1.0), vec3(0.0, 1.0, 0.0), vec2(1.0, 0.0)),
vertex_t(vec3(1.0, 1.0, -1.0), vec3(0.0, 1.0, 0.0)), vertex_t(vec3(1.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0), vec2(0.0, 1.0)),
vertex_t(vec3(1.0, 1.0, 1.0), vec3(0.0, 0.0, 1.0)), vertex_t(vec3(1.0, 1.0, -1.0), vec3(0.0, 1.0, 0.0), vec2(0.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, 1.0), vec3(0.0, 0.0, 1.0)), vertex_t(vec3(1.0, 1.0, 1.0), vec3(0.0, 0.0, 1.0), vec2(1.0, 1.0)),
vertex_t(vec3(1.0, -1.0, 1.0), vec3(0.0, 0.0, 1.0)), vertex_t(vec3(-1.0, -1.0, 1.0), vec3(0.0, 0.0, 1.0), vec2(0.0, 0.0)),
vertex_t(vec3(-1.0, 1.0, 1.0), vec3(-1.0, 0.0, 0.0)), vertex_t(vec3(1.0, -1.0, 1.0), vec3(0.0, 0.0, 1.0), vec2(1.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, -1.0), vec3(-1.0, 0.0, 0.0)), vertex_t(vec3(-1.0, 1.0, 1.0), vec3(-1.0, 0.0, 0.0), vec2(1.0, 1.0)),
vertex_t(vec3(-1.0, -1.0, 1.0), vec3(-1.0, 0.0, 0.0)), vertex_t(vec3(-1.0, -1.0, -1.0), vec3(-1.0, 0.0, 0.0), vec2(0.0, 0.0)),
vertex_t(vec3(1.0, -1.0, -1.0), vec3(0.0, -1.0, 0.0)), vertex_t(vec3(-1.0, -1.0, 1.0), vec3(-1.0, 0.0, 0.0), vec2(1.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, 1.0), vec3(0.0, -1.0, 0.0)), vertex_t(vec3(1.0, -1.0, -1.0), vec3(0.0, -1.0, 0.0), vec2(1.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, -1.0), vec3(0.0, -1.0, 0.0)), vertex_t(vec3(-1.0, -1.0, 1.0), vec3(0.0, -1.0, 0.0), vec2(0.0, 1.0)),
vertex_t(vec3(1.0, 1.0, -1.0), vec3(1.0, 0.0, 0.0)), vertex_t(vec3(-1.0, -1.0, -1.0), vec3(0.0, -1.0, 0.0), vec2(0.0, 0.0)),
vertex_t(vec3(1.0, -1.0, 1.0), vec3(1.0, 0.0, 0.0)), vertex_t(vec3(1.0, 1.0, -1.0), vec3(1.0, 0.0, 0.0), vec2(1.0, 1.0)),
vertex_t(vec3(1.0, -1.0, -1.0), vec3(1.0, 0.0, 0.0)), vertex_t(vec3(1.0, -1.0, 1.0), vec3(1.0, 0.0, 0.0), vec2(0.0, 0.0)),
vertex_t(vec3(-1.0, 1.0, -1.0), vec3(0.0, 0.0, -1.0)), vertex_t(vec3(1.0, -1.0, -1.0), vec3(1.0, 0.0, 0.0), vec2(1.0, 0.0)),
vertex_t(vec3(1.0, -1.0, -1.0), vec3(0.0, 0.0, -1.0)), vertex_t(vec3(-1.0, 1.0, -1.0), vec3(0.0, 0.0, -1.0), vec2(1.0, 1.0)),
vertex_t(vec3(-1.0, -1.0, -1.0), vec3(0.0, 0.0, -1.0)), vertex_t(vec3(1.0, -1.0, -1.0), vec3(0.0, 0.0, -1.0), vec2(0.0, 0.0)),
vertex_t(vec3(-1.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0)), vertex_t(vec3(-1.0, -1.0, -1.0), vec3(0.0, 0.0, -1.0), vec2(1.0, 0.0)),
vertex_t(vec3(-1.0, 1.0, 1.0), vec3(0.0, 0.0, 1.0)), vertex_t(vec3(-1.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0), vec2(1.0, 1.0)),
vertex_t(vec3(-1.0, 1.0, -1.0), vec3(-1.0, 0.0, 0.0)), vertex_t(vec3(-1.0, 1.0, 1.0), vec3(0.0, 0.0, 1.0), vec2(0.0, 1.0)),
vertex_t(vec3(1.0, -1.0, 1.0), vec3(0.0, -1.0, 0.0)), vertex_t(vec3(-1.0, 1.0, -1.0), vec3(-1.0, 0.0, 0.0), vec2(0.0, 1.0)),
vertex_t(vec3(1.0, 1.0, 1.0), vec3(1.0, 0.0, 0.0)), vertex_t(vec3(1.0, -1.0, 1.0), vec3(0.0, -1.0, 0.0), vec2(1.0, 1.0)),
vertex_t(vec3(1.0, 1.0, -1.0), vec3(0.0, 0.0, -1.0))); vertex_t(vec3(1.0, 1.0, 1.0), vec3(1.0, 0.0, 0.0), vec2(0.0, 1.0)),
vertex_t(vec3(1.0, 1.0, -1.0), vec3(0.0, 0.0, -1.0), vec2(0.0, 1.0))
);
uniform mat4 transform; uniform mat4 transform;
out vec3 PixelNormal; out vec3 PixelNormal;
out vec3 PixelColor; //out vec3 PixelColor;
out vec2 PixelTexture;
out float PixelBlock; out float PixelBlock;
struct block_t { struct block_t {
@ -46,6 +50,7 @@ layout (std430) readonly buffer BlocksLayout
block_t Blocks[]; block_t Blocks[];
}; };
/*
vec3 palette(float t) { vec3 palette(float t) {
vec3 a = vec3(0.5, 0.5, 0.5); vec3 a = vec3(0.5, 0.5, 0.5);
vec3 b = vec3(0.5, 0.5, 0.5); vec3 b = vec3(0.5, 0.5, 0.5);
@ -54,6 +59,7 @@ vec3 palette(float t) {
return a + b * cos(6.28318 * (c * t + d)); return a + b * cos(6.28318 * (c * t + d));
} }
*/
int sign_extend(uint x) int sign_extend(uint x)
{ {
@ -73,9 +79,10 @@ void vertexmain()
float chunk_z = float(sign_extend((block.x_z_blockid >> 8) & 0xff)); float chunk_z = float(sign_extend((block.x_z_blockid >> 8) & 0xff));
int block_id = int((block.x_z_blockid >> 16) & 0xff); int block_id = int((block.x_z_blockid >> 16) & 0xff);
PixelNormal = vertex.normal; PixelNormal = vertex.Normal;
PixelColor = palette(float(block_id) * 0.01); //PixelColor = palette(float(block_id) * 0.01);
PixelBlock = block_id; PixelBlock = block_id;
vec3 position = ((vertex.position * 0.4) + vec3(x, z, y) + vec3(chunk_x * 16.0, chunk_z * 16.0, 0)); PixelTexture = vertex.Texture;
vec3 position = ((vertex.Position * 0.5) + vec3(x, z, y) + vec3(chunk_x * 16.0, chunk_z * 16.0, 0));
love_Position = transform * vec4(position, 1.0); love_Position = transform * vec4(position, 1.0);
} }