This commit is contained in:
2025-02-18 07:34:16 +06:00
parent 5e42628595
commit 0368e3d654
14 changed files with 238 additions and 106 deletions

View File

@@ -5,11 +5,12 @@ layout (triangle_strip, max_vertices = 4) out;
layout(location = 0) in highp uvec3 Geometry[];
layout(location = 0) out Fragment {
layout(location = 0) out FragmentObj {
vec3 GeoPos; // Реальная позиция в мире
uint VoxMTL; // Материал вокселя
flat uint VoxMTL; // Материал вокселя
vec2 LUV;
} fragment;
flat uint Place;
} Fragment;
layout(push_constant) uniform UniformBufferObject {
mat4 projview;
@@ -43,195 +44,214 @@ void main() {
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);
int place = int(Geometry[0].x >> 27) & 0x7;
// Стартовая вершина
vec4 tempVec = baseVec;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv;
Fragment.GeoPos = vec3(tempVec);
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv;
Fragment.Place = place;
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.z += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(0, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.y;
tempVec.x += size.x / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, 0);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.z += size.y;
tempVec.x += size.x / 16.f;
tempVec.z += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 1: // xy
tempVec = baseVec;
tempVec.x += size.x;
tempVec.x += size.x / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, 0);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.y += size.y;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(0, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.y += size.y;
tempVec.x += size.x / 16.f;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 2: // zy
tempVec = baseVec;
tempVec.z += size.x;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(0, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.y += size.y;
tempVec.z += size.x / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, 0);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.x;
tempVec.y += size.y;
tempVec.z += size.x / 16.f;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 3: // xz inv
tempVec = baseVec;
tempVec.z += size.y;
tempVec.x += size.x / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, 0);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.z += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(0, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.z += size.y;
tempVec.x += size.x / 16.f;
tempVec.z += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 4: // xy inv
tempVec = baseVec;
tempVec.y += size.y;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(0, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.x += size.x / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, 0);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.x += size.x;
tempVec.y += size.y;
tempVec.x += size.x / 16.f;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
break;
case 5: // zy inv
tempVec = baseVec;
tempVec.y += size.y;
tempVec.z += size.x / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, 0);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, 0);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.x;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(0, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(0, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();
tempVec = baseVec;
tempVec.z += size.x;
tempVec.y += size.y;
tempVec.z += size.x / 16.f;
tempVec.y += size.y / 16.f;
tempVec = ubo.model*tempVec;
fragment.GeoPos = vec3(tempVec);
fragment.VoxMTL = voxMTL;
fragment.LUV = luv+vec2(size.x, size.y);
Fragment.GeoPos = tempVec.xyz;
Fragment.VoxMTL = voxMTL;
Fragment.LUV = luv+vec2(size.x, size.y);
Fragment.Place = place;
gl_Position = ubo.projview*tempVec;
EmitVertex();

Binary file not shown.

View File

@@ -2,8 +2,9 @@
layout(location = 0) in FragmentObj {
vec3 GeoPos; // Реальная позиция в мире
uint VoxMTL; // Материал вокселя
flat uint VoxMTL; // Материал вокселя
vec2 LUV;
flat uint Place;
} Fragment;
layout(location = 0) out vec4 Frame;
@@ -73,5 +74,24 @@ vec4 atlasColor(uint texId, vec2 uv)
}
void main() {
Frame = atlasColor(0, Fragment.GeoPos.xy);
vec2 uv;
switch(Fragment.Place) {
case 0:
uv = Fragment.GeoPos.xz; break;
case 1:
uv = Fragment.GeoPos.xy; break;
case 2:
uv = Fragment.GeoPos.zy; break;
case 3:
uv = Fragment.GeoPos.xz*vec2(-1, -1); break;
case 4:
uv = Fragment.GeoPos.xy*vec2(-1, 1); break;
case 5:
uv = Fragment.GeoPos.zy*vec2(-1, 1); break;
default:
uv = vec2(0);
}
Frame = atlasColor(Fragment.VoxMTL, uv);
}

View File

@@ -4,6 +4,7 @@ layout(location = 0) in Fragment {
vec3 GeoPos; // Реальная позиция в мире
uint VoxMTL; // Материал вокселя
vec2 LUV;
uint Place;
} fragment;
layout(location = 0) out vec4 Frame;