i did a little memory optimisation (19GB of VRAM -> 2.6GB of VRAM), lost some FPS in vertex rendering as a result but i'll figure it out
This commit is contained in:
parent
bf9af81f38
commit
ce7051d8ca
21 changed files with 766 additions and 592 deletions
|
|
@ -0,0 +1,96 @@
|
|||
#version 450
|
||||
|
||||
layout(location = 0) in uint inPackedVertex;
|
||||
|
||||
layout(location = 0) out vec4 outPos;
|
||||
layout(location = 1) out vec3 outNormal;
|
||||
layout(location = 2) out vec3 outTangent;
|
||||
layout(location = 3) out vec3 outBitangent;
|
||||
layout(location = 4) out vec2 outTextCoords;
|
||||
layout(location = 5) out mat4 viewMatrix;
|
||||
|
||||
const vec3 NORMALS[6] = vec3[6](
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, -1.0, 0.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3(-1.0, 0.0, 0.0),
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 0.0, 0.0, -1.0)
|
||||
);
|
||||
|
||||
const vec3 TANGENTS[6] = vec3[6](
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3( 0.0, 0.0, -1.0),
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3(-1.0, 0.0, 0.0)
|
||||
);
|
||||
|
||||
const vec3 BITANGENTS[6] = vec3[6](
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 0.0, 0.0, -1.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0)
|
||||
);
|
||||
|
||||
const vec2 CORNER_UVS[16] = vec2[16](
|
||||
vec2(0.5, 0.0),
|
||||
vec2(0.5, 0.5),
|
||||
vec2(1.0, 0.5),
|
||||
vec2(1.0, 0.0),
|
||||
|
||||
vec2(0.0, 0.5),
|
||||
vec2(0.0, 1.0),
|
||||
vec2(0.5, 1.0),
|
||||
vec2(0.5, 0.5),
|
||||
|
||||
vec2(0.5, 0.0),
|
||||
vec2(0.5, 0.5),
|
||||
vec2(1.0, 0.5),
|
||||
vec2(1.0, 0.0),
|
||||
|
||||
vec2(0.5, 0.0),
|
||||
vec2(0.5, 0.5),
|
||||
vec2(1.0, 0.5),
|
||||
vec2(1.0, 0.0)
|
||||
);
|
||||
|
||||
|
||||
layout(set = 0, binding = 0) uniform ProjUniform { mat4 matrix; } projUniform;
|
||||
layout(set = 1, binding = 0) uniform ViewUniform { mat4 matrix; } viewUniform;
|
||||
layout(push_constant) uniform pc {
|
||||
vec4 ModelOffset;
|
||||
vec4 Padding0;
|
||||
vec4 Padding1;
|
||||
vec4 Padding2;
|
||||
} push_constants;
|
||||
|
||||
void main() {
|
||||
viewMatrix = viewUniform.matrix;
|
||||
|
||||
uint posX = inPackedVertex & 0x1Fu;
|
||||
uint posY = (inPackedVertex >> 5u) & 0x1Fu;
|
||||
uint posZ = (inPackedVertex >> 10u) & 0x1Fu;
|
||||
uint faceIdx = (inPackedVertex >> 15u) & 0x7u;
|
||||
uint cornerIdx = (inPackedVertex >> 18u) & 0x3u;
|
||||
uint matId = (inPackedVertex >> 20u) & 0xFFu;
|
||||
|
||||
vec3 inPos = vec3(posX, posY, posZ) + push_constants.ModelOffset.xyz * 16.0;
|
||||
vec3 inNormal = NORMALS[faceIdx];
|
||||
vec3 inTangent = TANGENTS[faceIdx];
|
||||
vec3 inBitangent = BITANGENTS[faceIdx];
|
||||
|
||||
vec2 inTextCoords = CORNER_UVS[cornerIdx + 4 * matId];
|
||||
|
||||
vec4 worldPos = vec4(inPos, 1.0);
|
||||
gl_Position = projUniform.matrix * viewUniform.matrix * worldPos;
|
||||
|
||||
outPos = worldPos;
|
||||
outNormal = inNormal;
|
||||
outTangent = inTangent;
|
||||
outBitangent = inBitangent;
|
||||
outTextCoords = inTextCoords;
|
||||
}
|
||||
149
resources/EngineResources/shaders/packed_scene_vertex.glsl
Normal file
149
resources/EngineResources/shaders/packed_scene_vertex.glsl
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
#version 450
|
||||
|
||||
layout(location = 0) out vec4 outPos;
|
||||
layout(location = 1) out vec3 outNormal;
|
||||
layout(location = 2) out vec3 outTangent;
|
||||
layout(location = 3) out vec3 outBitangent;
|
||||
layout(location = 4) out vec2 outTextCoords;
|
||||
layout(location = 5) out mat4 viewMatrix;
|
||||
|
||||
layout(set = 0, binding = 0) uniform ProjUniform { mat4 matrix; } projUniform;
|
||||
layout(set = 1, binding = 0) uniform ViewUniform { mat4 matrix; } viewUniform;
|
||||
|
||||
layout(set = 4, binding = 0) readonly buffer FaceBuffer {
|
||||
uint faces[];
|
||||
};
|
||||
|
||||
layout(push_constant) uniform pc {
|
||||
vec4 ModelOffset;
|
||||
vec4 Padding0;
|
||||
vec4 Padding1;
|
||||
vec4 Padding2;
|
||||
} push_constants;
|
||||
|
||||
const uint TRI_TO_CORNER[6] = uint[6](0u, 1u, 2u, 0u, 2u, 3u);
|
||||
|
||||
const vec3 NORMALS[6] = vec3[6](
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, -1.0, 0.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3(-1.0, 0.0, 0.0),
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 0.0, 0.0, -1.0)
|
||||
);
|
||||
|
||||
const vec3 TANGENTS[6] = vec3[6](
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3( 0.0, 0.0, -1.0),
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 1.0, 0.0, 0.0),
|
||||
vec3(-1.0, 0.0, 0.0)
|
||||
);
|
||||
|
||||
const vec3 BITANGENTS[6] = vec3[6](
|
||||
vec3( 0.0, 0.0, 1.0),
|
||||
vec3( 0.0, 0.0, -1.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0),
|
||||
vec3( 0.0, 1.0, 0.0)
|
||||
);
|
||||
|
||||
const vec2 CORNER_UVS[16] = vec2[16](
|
||||
vec2(0.5, 0.0),
|
||||
vec2(0.5, 0.5),
|
||||
vec2(1.0, 0.5),
|
||||
vec2(1.0, 0.0),
|
||||
|
||||
vec2(0.0, 0.5),
|
||||
vec2(0.0, 1.0),
|
||||
vec2(0.5, 1.0),
|
||||
vec2(0.5, 0.5),
|
||||
|
||||
vec2(0.5, 0.0),
|
||||
vec2(0.5, 0.5),
|
||||
vec2(1.0, 0.5),
|
||||
vec2(1.0, 0.0),
|
||||
|
||||
vec2(0.5, 0.0),
|
||||
vec2(0.5, 0.5),
|
||||
vec2(1.0, 0.5),
|
||||
vec2(1.0, 0.0)
|
||||
);
|
||||
|
||||
vec3 buildFaceCornerPosition(uvec3 voxelPos, uint faceId, uint cornerIndex) {
|
||||
vec3 p = vec3(voxelPos);
|
||||
|
||||
if (faceId == 0u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 1.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(0.0, 1.0, 1.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0);
|
||||
return p + vec3(1.0, 1.0, 0.0);
|
||||
}
|
||||
|
||||
if (faceId == 1u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(1.0, 0.0, 0.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 0.0, 1.0);
|
||||
return p + vec3(0.0, 0.0, 1.0);
|
||||
}
|
||||
|
||||
if (faceId == 2u) {
|
||||
if (cornerIndex == 0u) return p + vec3(1.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(1.0, 1.0, 0.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0);
|
||||
return p + vec3(1.0, 0.0, 1.0);
|
||||
}
|
||||
|
||||
if (faceId == 3u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(0.0, 0.0, 1.0);
|
||||
if (cornerIndex == 2u) return p + vec3(0.0, 1.0, 1.0);
|
||||
return p + vec3(0.0, 1.0, 0.0);
|
||||
}
|
||||
|
||||
if (faceId == 4u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 1.0);
|
||||
if (cornerIndex == 1u) return p + vec3(1.0, 0.0, 1.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0);
|
||||
return p + vec3(0.0, 1.0, 1.0);
|
||||
}
|
||||
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(0.0, 1.0, 0.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 0.0);
|
||||
return p + vec3(1.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
viewMatrix = viewUniform.matrix;
|
||||
|
||||
uint faceRecordIndex = uint(gl_VertexIndex) / 6u;
|
||||
uint triangleVertex = uint(gl_VertexIndex) % 6u;
|
||||
uint cornerIndex = TRI_TO_CORNER[triangleVertex];
|
||||
|
||||
uint packedFace = faces[faceRecordIndex];
|
||||
|
||||
uint voxelX = packedFace & 0x1Fu;
|
||||
uint voxelY = (packedFace >> 5u) & 0x1Fu;
|
||||
uint voxelZ = (packedFace >> 10u) & 0x1Fu;
|
||||
uint faceId = (packedFace >> 15u) & 0x7u;
|
||||
uint matId = (packedFace >> 18u) & 0xFFu;
|
||||
|
||||
faceId = min(faceId, 5u);
|
||||
matId = min(matId, 3u);
|
||||
|
||||
vec3 localPos = buildFaceCornerPosition(uvec3(voxelX, voxelY, voxelZ), faceId, cornerIndex);
|
||||
vec3 worldPos = localPos + push_constants.ModelOffset.xyz * 16.0;
|
||||
|
||||
vec4 worldPosVec4 = vec4(worldPos, 1.0);
|
||||
|
||||
gl_Position = projUniform.matrix * viewUniform.matrix * worldPosVec4;
|
||||
|
||||
outPos = worldPosVec4;
|
||||
outNormal = NORMALS[faceId];
|
||||
outTangent = TANGENTS[faceId];
|
||||
outBitangent = BITANGENTS[faceId];
|
||||
outTextCoords = CORNER_UVS[cornerIndex + 4u * matId];
|
||||
}
|
||||
84
resources/EngineResources/shaders/shadow_vertex_packed.glsl
Normal file
84
resources/EngineResources/shaders/shadow_vertex_packed.glsl
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
#version 450
|
||||
|
||||
layout(set = 3, binding = 0) readonly buffer FaceBuffer {
|
||||
uint faces[];
|
||||
};
|
||||
|
||||
layout(push_constant) uniform matrices {
|
||||
vec4 ModelOffset;
|
||||
vec4 Padding0;
|
||||
vec4 Padding1;
|
||||
vec4 Padding2;
|
||||
uint materialIdx;
|
||||
} push_constants;
|
||||
|
||||
layout(location = 0) out vec2 outTextCoord;
|
||||
layout(location = 1) out flat uint outMaterialIdx;
|
||||
|
||||
const uint TRI_TO_CORNER[6] = uint[6](0u, 1u, 2u, 0u, 2u, 3u);
|
||||
|
||||
vec3 buildFaceCornerPosition(uvec3 voxelPos, uint faceId, uint cornerIndex) {
|
||||
vec3 p = vec3(voxelPos);
|
||||
|
||||
if (faceId == 0u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 1.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(0.0, 1.0, 1.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0);
|
||||
return p + vec3(1.0, 1.0, 0.0);
|
||||
}
|
||||
|
||||
if (faceId == 1u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(1.0, 0.0, 0.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 0.0, 1.0);
|
||||
return p + vec3(0.0, 0.0, 1.0);
|
||||
}
|
||||
|
||||
if (faceId == 2u) {
|
||||
if (cornerIndex == 0u) return p + vec3(1.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(1.0, 1.0, 0.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0);
|
||||
return p + vec3(1.0, 0.0, 1.0);
|
||||
}
|
||||
|
||||
if (faceId == 3u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(0.0, 0.0, 1.0);
|
||||
if (cornerIndex == 2u) return p + vec3(0.0, 1.0, 1.0);
|
||||
return p + vec3(0.0, 1.0, 0.0);
|
||||
}
|
||||
|
||||
if (faceId == 4u) {
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 1.0);
|
||||
if (cornerIndex == 1u) return p + vec3(1.0, 0.0, 1.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 1.0);
|
||||
return p + vec3(0.0, 1.0, 1.0);
|
||||
}
|
||||
|
||||
if (cornerIndex == 0u) return p + vec3(0.0, 0.0, 0.0);
|
||||
if (cornerIndex == 1u) return p + vec3(0.0, 1.0, 0.0);
|
||||
if (cornerIndex == 2u) return p + vec3(1.0, 1.0, 0.0);
|
||||
return p + vec3(1.0, 0.0, 0.0);
|
||||
}
|
||||
|
||||
void main() {
|
||||
uint faceRecordIndex = uint(gl_VertexIndex) / 6u;
|
||||
uint triangleVertex = uint(gl_VertexIndex) % 6u;
|
||||
uint cornerIndex = TRI_TO_CORNER[triangleVertex];
|
||||
|
||||
uint packedFace = faces[faceRecordIndex];
|
||||
|
||||
uint voxelX = packedFace & 0x1Fu;
|
||||
uint voxelY = (packedFace >> 5u) & 0x1Fu;
|
||||
uint voxelZ = (packedFace >> 10u) & 0x1Fu;
|
||||
uint faceId = (packedFace >> 15u) & 0x7u;
|
||||
uint matId = (packedFace >> 18u) & 0xFFu;
|
||||
|
||||
vec3 localPos = buildFaceCornerPosition(uvec3(voxelX, voxelY, voxelZ), faceId, cornerIndex);
|
||||
vec3 worldPos = localPos + push_constants.ModelOffset.xyz * 16.0;
|
||||
|
||||
outTextCoord = vec2(0.0);
|
||||
outMaterialIdx = matId;
|
||||
|
||||
gl_Position = vec4(worldPos, 1.0);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue