Рисуем квадратик

This commit is contained in:
2025-02-15 16:55:43 +06:00
parent 35d71c211b
commit dce0272653
31 changed files with 434 additions and 174 deletions

Binary file not shown.

Binary file not shown.

View File

View File

@@ -1,28 +0,0 @@
#version 450
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
layout(location = 0) in GeometryObj {
vec3 GeoPos; // Реальная позиция в мире
uint Texture; // Текстура
vec2 UV;
} Geometry[];
layout(location = 0) out FragmentObj {
vec3 GeoPos; // Реальная позиция в мире
uint Texture; // Текстура
vec2 UV;
} Fragment;
void main() {
for(int iter = 0; iter < 3; iter++) {
gl_Position = gl_in[iter].gl_Position;
Fragment.GeoPos = Geometry[iter].GeoPos;
Fragment.Texture = Geometry[iter].Texture;
Fragment.UV = Geometry[iter].UV;
EmitVertex();
}
EndPrimitive();
}

View File

@@ -1,44 +0,0 @@
#version 450
layout(location = 0) in uvec4 Vertex;
layout(location = 0) out GeometryObj {
vec3 GeoPos; // Реальная позиция в мире
uint Texture; // Текстура
vec2 UV;
} Geometry;
layout(push_constant) uniform UniformBufferObject {
mat4 projview;
mat4 model;
} ubo;
// struct NodeVertexStatic {
// uint32_t
// FX : 9, FY : 9, FZ : 9, // Позиция -112 ~ 369 / 16
// N1 : 4, // Не занято
// LS : 1, // Масштаб карты освещения (1м/16 или 1м)
// Tex : 18, // Текстура
// N2 : 14, // Не занято
// TU : 16, TV : 16; // UV на текстуре
// };
void main()
{
vec4 baseVec = ubo.model*vec4(
float(Vertex.x & 0x1ff) / 16.f - 7,
float((Vertex.x >> 9) & 0x1ff) / 16.f - 7,
float((Vertex.x >> 18) & 0x1ff) / 16.f - 7,
1
);
Geometry.GeoPos = baseVec.xyz;
Geometry.Texture = Vertex.y & 0x3ffff;
Geometry.UV = vec2(
float(Vertex.z & 0xffff) / pow(2, 16),
float((Vertex.z >> 16) & 0xffff) / pow(2, 16)
);
gl_Position = ubo.projview*baseVec;
}

View File

@@ -1,23 +0,0 @@
#version 450
layout(location = 0) in FragmentObj {
vec3 GeoPos; // Реальная позиция в мире
uint Texture; // Текстура
vec2 UV;
} Fragment;
layout(location = 0) out vec4 Frame;
uniform layout(set = 0, binding = 0) sampler2DArray MainAtlas;
layout(set = 0, binding = 1) readonly buffer MainAtlasLayoutObj {
vec3 Color;
} MainAtlasLayout;
uniform layout(set = 1, binding = 0) sampler2DArray LightMap;
layout(set = 1, binding = 1) readonly buffer LightMapLayoutObj {
vec3 Color;
} LightMapLayout;
void main() {
Frame = vec4(1);
}

View File

@@ -1,23 +0,0 @@
#version 450
layout(location = 0) in FragmentObj {
vec3 GeoPos; // Реальная позиция в мире
uint Texture; // Текстура
vec2 UV;
} Fragment;
layout(location = 0) out vec4 Frame;
uniform layout(set = 0, binding = 0) sampler2DArray MainAtlas;
layout(set = 0, binding = 1) readonly buffer MainAtlasLayoutObj {
vec3 Color;
} MainAtlasLayout;
uniform layout(set = 1, binding = 0) sampler2DArray LightMap;
layout(set = 1, binding = 1) readonly buffer LightMapLayoutObj {
vec3 Color;
} LightMapLayout;
void main() {
Frame = vec4(1);
}

View File

@@ -1,244 +0,0 @@
#version 450
layout (points) in;
layout (triangle_strip, max_vertices = 4) out;
layout(location = 0) in highp uvec3 Geometry[];
layout(location = 0) out Fragment {
vec3 GeoPos; // Реальная позиция в мире
uint VoxMTL; // Материал вокселя
vec2 LUV;
} fragment;
layout(push_constant) uniform UniformBufferObject {
mat4 projview;
mat4 model;
} ubo;
// struct VoxelVertexPoint {
// uint32_t
// FX : 9, FY : 9, FZ : 9, // Позиция
// Place : 3, // Положение распространения xz, xy, zy, и обратные
// N1 : 1, // Не занято
// LS : 1, // Масштаб карты освещения (1м/16 или 1м)
// TX : 8, TY : 8, // Размер+1
// VoxMtl : 16, // Материал вокселя DefVoxelId_t
// LU : 14, LV : 14, // Позиция на карте освещения
// N2 : 2; // Не занято
// };
void main() {
vec4 baseVec = vec4(
float(Geometry[0].x & 0x1ff) / 16.f,
float((Geometry[0].x >> 9) & 0x1ff) / 16.f,
float((Geometry[0].x >> 18) & 0x1ff) / 16.f,
1
);
vec2 size = vec2(
float(Geometry[0].y & 0xff)+1,
float((Geometry[0].y >> 8) & 0xff)+1
);
uint voxMTL = ((Geometry[0].y >> 16) & 0xffff);
vec2 luv = vec2(float(Geometry[0].z & 0x3fff)+0.5f, float((Geometry[0].z >> 14) & 0x3fff)+0.5f);
// Стартовая вершина
vec4 tempVec = baseVec;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv;
gl_Position = ubo.projview*tempVec;
EmitVertex();
int place = int(Geometry[0].x >> 27) & 0x3;
switch(place) {
case 0: // xz
tempVec = baseVec;
tempVec.x += size.x;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.z += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 1: // xy
tempVec = baseVec;
tempVec.x += size.x;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 2: // zy
tempVec = baseVec;
tempVec.z += size.x;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.x;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 3: // xz inv
tempVec = baseVec;
tempVec.z += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.z += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 4: // xy inv
tempVec = baseVec;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 5: // zy inv
tempVec = baseVec;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.x;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.x;
tempVec.y += size.y;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
default:
break;
}
EndPrimitive();
}

View File

@@ -1,10 +0,0 @@
#version 450
layout(location = 0) in uvec3 Vertex;
layout(location = 0) out uvec3 Geometry;
void main()
{
Geometry = Vertex;
}

View File

@@ -1,23 +0,0 @@
#version 450
layout(location = 0) in Fragment {
vec3 GeoPos; // Реальная позиция в мире
uint VoxMTL; // Материал вокселя
vec2 LUV;
} fragment;
layout(location = 0) out vec4 Frame;
uniform layout(set = 0, binding = 0) sampler2DArray MainAtlas;
layout(set = 0, binding = 1) readonly buffer MainAtlasLayoutObj {
vec3 Color;
} MainAtlasLayout;
uniform layout(set = 1, binding = 0) sampler2DArray LightMap;
layout(set = 1, binding = 1) readonly buffer LightMapLayoutObj {
vec3 Color;
} LightMapLayout;
void main() {
Frame = vec4(1);
}

View File

@@ -1,23 +0,0 @@
#version 450
layout(location = 0) in Fragment {
vec3 GeoPos; // Реальная позиция в мире
uint VoxMTL; // Материал вокселя
vec2 LUV;
} fragment;
layout(location = 0) out vec4 Frame;
uniform layout(set = 0, binding = 0) sampler2DArray MainAtlas;
layout(set = 0, binding = 1) readonly buffer MainAtlasLayoutObj {
vec3 Color;
} MainAtlasLayout;
uniform layout(set = 1, binding = 0) sampler2DArray LightMap;
layout(set = 1, binding = 1) readonly buffer LightMapLayoutObj {
vec3 Color;
} LightMapLayout;
void main() {
Frame = vec4(1);
}

View File

@@ -1,18 +0,0 @@
#!/bin/sh
function compile_shaders() {
local source_dir="$1"
for item in "$source_dir"/*; do
filename=$(basename "$item")
if [ -d "$item" ]; then
compile_shaders "$source_dir"/"$filename"
elif [ -f "$item" ] && [ $item -nt $item.bin ] && ([[ $filename = *'.frag' ]] || [[ $filename = *'.vert' ]] || [[ $filename = *'.geom' ]]); then
echo $filename
glslc $item -o $item.bin --target-env=vulkan1.2
fi
done
}
compile_shaders .