diff --git a/data/shaders/terraintessellation/terrain.frag b/data/shaders/terraintessellation/terrain.frag index 4d20d36e..61354832 100644 --- a/data/shaders/terraintessellation/terrain.frag +++ b/data/shaders/terraintessellation/terrain.frag @@ -16,22 +16,24 @@ layout (location = 0) out vec4 outFragColor; vec4 sampleTerrainLayer() { // Define some layer ranges for sampling depending on terrain height - vec2 layers[4]; - layers[0] = vec2(0.0, 5.0); - layers[1] = vec2(5.0, 50.0); - layers[2] = vec2(50.0, 120.0); - layers[3] = vec2(120.0, 255.0); + vec2 layers[6]; + layers[0] = vec2(-10.0, 10.0); + layers[1] = vec2(5.0, 35.0); + layers[2] = vec2(30.0, 70.0); + layers[3] = vec2(60.0, 95.0); + layers[4] = vec2(85.0, 140.0); + layers[5] = vec2(140.0, 190.0); vec3 color = vec3(0.0); // Get height from displacement map float height = textureLod(displacementMap, inUV, 0.0).r * 255.0; - for (int i = 0; i < 4; i++) + for (int i = 0; i < 6; i++) { float range = layers[i].y - layers[i].x; float weight = (range - abs(height - layers[i].y)) / range; - weight = max(0.05, weight); + weight = max(0.0, weight); color += weight * texture(terrainLayers, vec3(inUV * 16.0, i)).rgb; } diff --git a/data/shaders/terraintessellation/terrain.frag.spv b/data/shaders/terraintessellation/terrain.frag.spv index e4dbed5b..04b71e3e 100644 Binary files a/data/shaders/terraintessellation/terrain.frag.spv and b/data/shaders/terraintessellation/terrain.frag.spv differ diff --git a/data/textures/terrain_heightmap_r8.ktx b/data/textures/terrain_heightmap_r8.ktx new file mode 100644 index 00000000..e2076674 Binary files /dev/null and b/data/textures/terrain_heightmap_r8.ktx differ diff --git a/data/textures/terrain_texturearray_bc3.ktx b/data/textures/terrain_texturearray_bc3.ktx new file mode 100644 index 00000000..fd0ca6fd Binary files /dev/null and b/data/textures/terrain_texturearray_bc3.ktx differ diff --git a/terraintessellation/terraintessellation.cpp b/terraintessellation/terraintessellation.cpp index 876544c1..4e3e00ac 100644 --- a/terraintessellation/terraintessellation.cpp +++ b/terraintessellation/terraintessellation.cpp @@ -66,7 +66,7 @@ public: glm::mat4 projection; glm::mat4 modelview; glm::vec4 lightPos = glm::vec4(0.0f, -2.0f, 0.0f, 0.0f); - float displacementFactor = 16.0f; + float displacementFactor = 16.0f * 2.0f; float tessellationFactor = 0.75f; glm::vec2 viewportDim; // Desired size of tessellated quad patch edge @@ -146,9 +146,10 @@ public: void loadTextures() { textureLoader->loadTexture(getAssetPath() + "textures/skysphere_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, &textures.skySphere); - textureLoader->loadTexture(getAssetPath() + "textures/terrain_desert_heightmap.ktx", VK_FORMAT_R8G8B8A8_UNORM, &textures.heightMap); - - textureLoader->loadTextureArray(getAssetPath() + "textures/terrain_array_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, &textures.terrainArray); + // Height data is stored in a one-channel texture + textureLoader->loadTexture(getAssetPath() + "textures/terrain_heightmap_r8.ktx", VK_FORMAT_R8_UNORM, &textures.heightMap); + // Terrain textures are stored in a texture array with layers corresponding to terrain height + textureLoader->loadTextureArray(getAssetPath() + "textures/terrain_texturearray_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, &textures.terrainArray); VkSamplerCreateInfo samplerInfo = vkTools::initializers::samplerCreateInfo(); @@ -270,7 +271,7 @@ public: }; #define PATCH_SIZE 64 - #define UV_SCALE 2.0f + #define UV_SCALE 1.0f Vertex *vertices = new Vertex[PATCH_SIZE * PATCH_SIZE * 4];