Improved island generation
This commit is contained in:
parent
8c301d0ac1
commit
4565188f15
5 changed files with 91 additions and 126 deletions
|
|
@ -102,11 +102,16 @@ void main() {
|
|||
ivec3 localPos = ivec3(gl_GlobalInvocationID.xyz);
|
||||
ivec3 worldPos = chunkPos * CHUNK_SIZE + localPos;
|
||||
|
||||
float islandheight = valueNoise(vec2(worldPos.z, worldPos.x) * 0.005) * 100 + valueNoise(vec2(worldPos.x, worldPos.z) * 0.1) * 20 + valueNoise(vec2(worldPos.x, worldPos.z) * 0.1) * 5+ valueNoise(vec2(worldPos.x, worldPos.z)) * 0.5 - 15;
|
||||
float YZone = floor(worldPos.y/150.0)*150.0;
|
||||
float islandheight = valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2) * 0.005) * 100 + valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2) * 0.1) * 20 + valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2) * 0.1) * 5+ valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2)) * 0.5 - 15 + YZone;
|
||||
float height = valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2) * 0.005) * 100 + valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2) * 0.01) * 10 + valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2) * 0.1) * 5+ valueNoise(vec2(worldPos.x + YZone * 2, worldPos.z + YZone * 2)) * 0.5 + YZone;
|
||||
|
||||
float height = valueNoise(vec2(worldPos.x, worldPos.z) * 0.005) * 100 + valueNoise(vec2(worldPos.x, worldPos.z) * 0.01) * 10 + valueNoise(vec2(worldPos.x, worldPos.z) * 0.1) * 5+ valueNoise(vec2(worldPos.x, worldPos.z)) * 0.5;
|
||||
float height2 = valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.005) * 100 + valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.01) * 10 + valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.1) * 5+ valueNoise(vec2(-worldPos.x, -worldPos.z)) * 0.5 + 100;
|
||||
float islandheight2 = 100 + valueNoise(vec2(-worldPos.z, -worldPos.x) * 0.005) * 100 + valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.1) * 20 + valueNoise(vec2(worldPos.x, worldPos.z) * 0.1) * 5+ valueNoise(vec2(worldPos.x, worldPos.z)) * 0.5 - 5;
|
||||
float YZone2 = floor(worldPos.y/75.0)*75.0;
|
||||
float islandheight2 = valueNoise(vec2(worldPos.x - YZone2 * 2, worldPos.z -YZone2 * 2) * 0.005) * 60 + valueNoise(vec2(worldPos.x + YZone2 * 2, worldPos.z + YZone2 * 2) * 0.1) * 20 + valueNoise(vec2(worldPos.x + YZone2 * 2, worldPos.z + YZone2 * 2) * 0.1) * 10+ valueNoise(vec2(worldPos.x + YZone2 * 2, worldPos.z + YZone2 * 2)) * 0.5 - 5 + YZone2;
|
||||
float height2 = valueNoise(vec2(worldPos.x + YZone2 * 2, worldPos.z + YZone2 * 2) * 0.005) * 50 + valueNoise(vec2(worldPos.x + YZone2 * 2, worldPos.z + YZone2 * 2) * 0.01) * 10 + valueNoise(vec2(worldPos.x + YZone2 * 2, worldPos.z + YZone2 * 2) * 0.1) * 5+ valueNoise(vec2(worldPos.x + YZone2 * 2, worldPos.z + YZone2 * 2)) * 0.5 + YZone2;
|
||||
|
||||
//float height2 = valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.005) * 100 + valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.01) * 10 + valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.1) * 5+ valueNoise(vec2(-worldPos.x, -worldPos.z)) * 0.5 + 100;
|
||||
//float islandheight2 = 100 + valueNoise(vec2(-worldPos.z, -worldPos.x) * 0.005) * 100 + valueNoise(vec2(-worldPos.x, -worldPos.z) * 0.1) * 20 + valueNoise(vec2(worldPos.x, worldPos.z) * 0.1) * 5+ valueNoise(vec2(worldPos.x, worldPos.z)) * 0.5 - 5;
|
||||
//height = clamp(height, 4.0, 28.0);
|
||||
uint voxelType = 0u;
|
||||
|
||||
|
|
@ -114,14 +119,14 @@ void main() {
|
|||
float depthBelowSurface = height - float(worldPos.y);
|
||||
|
||||
if (depthBelowSurface < 1.5) {
|
||||
voxelType = 1u; // Grass/topsoil
|
||||
voxelType = 1u; // Grass
|
||||
} else if (depthBelowSurface < 5.0) {
|
||||
voxelType = 2u; // Dirt
|
||||
voxelType = 2u; // Dirt(also stone rn)
|
||||
} else {
|
||||
voxelType = 3u; // Stone
|
||||
}
|
||||
}
|
||||
if(float(worldPos.y) <= height2 && float(worldPos.y) >= islandheight2){
|
||||
else if (float(worldPos.y) <= height2 && float(worldPos.y) >= islandheight2) {
|
||||
float depthBelowSurface = height2 - float(worldPos.y);
|
||||
|
||||
if (depthBelowSurface < 1.5) {
|
||||
|
|
|
|||
|
|
@ -51,78 +51,32 @@ const vec3 BITANGENTS[6] = vec3[6](
|
|||
);
|
||||
|
||||
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)
|
||||
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);
|
||||
}
|
||||
const vec3 FACE_CORNERS[6][4] = vec3[6][4](
|
||||
vec3[4](vec3(0.0, 1.0, 0.0), vec3(0.0, 1.0, 1.0), vec3(1.0, 1.0, 1.0), vec3(1.0, 1.0, 0.0)), // Face 0 (+Y)
|
||||
vec3[4](vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), vec3(1.0, 0.0, 1.0), vec3(0.0, 0.0, 1.0)), // Face 1 (-Y)
|
||||
vec3[4](vec3(1.0, 0.0, 0.0), vec3(1.0, 1.0, 0.0), vec3(1.0, 1.0, 1.0), vec3(1.0, 0.0, 1.0)), // Face 2 (+X)
|
||||
vec3[4](vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 1.0), vec3(0.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0)), // Face 3 (-X)
|
||||
vec3[4](vec3(0.0, 0.0, 1.0), vec3(1.0, 0.0, 1.0), vec3(1.0, 1.0, 1.0), vec3(0.0, 1.0, 1.0)), // Face 4 (+Z)
|
||||
vec3[4](vec3(0.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), vec3(1.0, 1.0, 0.0), vec3(1.0, 0.0, 0.0)) // Face 5 (-Z)
|
||||
);
|
||||
|
||||
void main() {
|
||||
viewMatrix = viewUniform.matrix;
|
||||
|
||||
uint faceRecordIndex = uint(gl_VertexIndex) / 6u;
|
||||
uint triangleVertex = uint(gl_VertexIndex) % 6u;
|
||||
uint triangleVertex = (uint(gl_VertexIndex))% 6u;
|
||||
uint cornerIndex = TRI_TO_CORNER[triangleVertex];
|
||||
|
||||
//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;
|
||||
|
|
@ -134,7 +88,7 @@ void main() {
|
|||
faceId = min(faceId, 5u);
|
||||
matId = min(matId, 3u);
|
||||
|
||||
vec3 localPos = buildFaceCornerPosition(uvec3(voxelX, voxelY, voxelZ), faceId, cornerIndex);
|
||||
vec3 localPos = vec3(voxelX, voxelY, voxelZ) + FACE_CORNERS[faceId][cornerIndex];
|
||||
vec3 worldPos = localPos + push_constants.ModelOffset.xyz * 16.0;
|
||||
|
||||
vec4 worldPosVec4 = vec4(worldPos, 1.0);
|
||||
|
|
@ -145,5 +99,5 @@ void main() {
|
|||
outNormal = NORMALS[faceId];
|
||||
outTangent = TANGENTS[faceId];
|
||||
outBitangent = BITANGENTS[faceId];
|
||||
outTextCoords = CORNER_UVS[cornerIndex + 4u * matId];
|
||||
outTextCoords = CORNER_UVS[cornerIndex + (matId << 2u)];
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue