Toggle show chunk edges from gui and calculate level weights only once per vertex

This commit is contained in:
Erik Broberg
2016-06-09 17:14:46 -04:00
parent 25d02086a1
commit 0ef0343efd
9 changed files with 51 additions and 91 deletions

View File

@@ -107,6 +107,7 @@ namespace openspace {
bool blendWaterMask;
bool blendOverlay;
bool atmosphereEnabled;
bool showChunkEdges;
private:

View File

@@ -68,6 +68,7 @@ namespace openspace {
, blendOverlay(properties::BoolProperty("blendOverlay", "blendOverlay", true))
, blendWaterMask(properties::BoolProperty("blendWaterMask", "blendWaterMask", true))
, atmosphereEnabled(properties::BoolProperty("atmosphereEnabled", "atmosphereEnabled", false))
, showChunkEdges(properties::BoolProperty("showChunkEdges", "showChunkEdges", false))
{
setName("RenderableGlobe");
@@ -86,6 +87,7 @@ namespace openspace {
addProperty(blendOverlay);
addProperty(blendWaterMask);
addProperty(atmosphereEnabled);
addProperty(showChunkEdges);
doFrustumCulling.setValue(true);
doHorizonCulling.setValue(true);
@@ -200,6 +202,7 @@ namespace openspace {
_chunkedLodGlobe->blendOverlay = blendOverlay.value();
_chunkedLodGlobe->blendWaterMask = blendWaterMask.value();
_chunkedLodGlobe->atmosphereEnabled = atmosphereEnabled.value();
_chunkedLodGlobe->showChunkEdges = showChunkEdges.value();
std::vector<TileProviderManager::TileProviderWithName>& colorTextureProviders =
_tileProviderManager->colorTextureProviders();

View File

@@ -82,6 +82,7 @@ public:
properties::BoolProperty blendOverlay;
properties::BoolProperty blendWaterMask;
properties::BoolProperty atmosphereEnabled;
properties::BoolProperty showChunkEdges;
private:
std::string _frame;

View File

@@ -187,6 +187,12 @@ namespace openspace {
"useAtmosphere",
std::to_string(chunk.owner()->atmosphereEnabled)));
layeredTexturePreprocessingData.keyValuePairs.push_back(
std::pair<std::string, std::string>(
"showChunkEdges",
std::to_string(chunk.owner()->showChunkEdges)));
// Now the shader program can be accessed
ProgramObject* programObject =
layeredTextureShaderProvider->getUpdatedShaderProgram(

View File

@@ -60,20 +60,20 @@ in vec3 ellipsoidNormalCameraSpace;
in vec4 fs_position;
in vec2 fs_uv;
in float levelInterpolationParameter;
in LevelWeights levelWeights;
Fragment getFragment() {
Fragment frag;
frag.color = vec4(0.1,0.1,0.1,1);
//LevelWeights levelWeights = getLevelWeights(levelInterpolationParameter);
#if USE_COLORTEXTURE
frag.color = calculateColor(
fs_uv,
levelInterpolationParameter,
levelWeights,//levelInterpolationParameter,
colorTiles,
colorTilesParent1,
colorTilesParent2);
@@ -85,7 +85,7 @@ Fragment getFragment() {
frag.color = calculateWater(
frag.color,
fs_uv,
levelInterpolationParameter,
levelWeights,
waterTiles,
waterTilesParent1,
waterTilesParent2);
@@ -97,7 +97,7 @@ Fragment getFragment() {
frag.color = calculateNight(
frag.color,
fs_uv,
levelInterpolationParameter,
levelWeights,
nightTiles,
nightTilesParent1,
nightTilesParent2,
@@ -114,14 +114,16 @@ Fragment getFragment() {
frag.color = calculateOverlay(
frag.color,
fs_uv,
levelInterpolationParameter,
levelWeights,
overlayTiles,
overlayTilesParent1,
overlayTilesParent2);
#endif // USE_OVERLAY
//frag.color += patchBorderOverlay(fs_uv, vec3(0,1,0), 0.02);
#if SHOW_CHUNK_EDGES
frag.color += patchBorderOverlay(fs_uv, vec3(0,1,0), 0.02);
#endif // SHOW_CHUNK_EDGES
frag.depth = fs_position.w;

View File

@@ -54,9 +54,8 @@ layout(location = 1) in vec2 in_uv;
out vec2 fs_uv;
out vec4 fs_position;
out vec3 ellipsoidNormalCameraSpace;
// levelInterpolationParameter is used to interpolate between a tile and its parent tiles
// The value increases with the distance from the vertex (or fragment) to the camera
out float levelInterpolationParameter;
out LevelWeights levelWeights;
PositionNormalPair globalInterpolation() {
vec2 lonLatInput;
@@ -74,8 +73,8 @@ void main()
float projectedScaleFactor = distanceScaleFactor / distToVertexOnEllipsoid;
float desiredLevel = log2(projectedScaleFactor);
levelInterpolationParameter = chunkLevel - desiredLevel;
float levelInterpolationParameter = chunkLevel - desiredLevel;
levelWeights = getLevelWeights(levelInterpolationParameter);
float height = 0;
#if USE_HEIGHTMAP
@@ -84,7 +83,7 @@ void main()
// Before any heightmapping is done
height = calculateHeight(
in_uv,
levelInterpolationParameter, // Variable to determine which texture to sample from
levelWeights, // Variable to determine which texture to sample from
heightTiles, heightTilesParent1, heightTilesParent2); // Three textures to sample from
#endif // USE_HEIGHTMAP

View File

@@ -53,7 +53,7 @@ uniform Tile waterTilesParent2[NUMLAYERS_WATERMASK];
// levelInterpolationParameter is used to interpolate between a tile and its parent tiles
// The value increases with the distance from the vertex (or fragment) to the camera
in float levelInterpolationParameter;
in LevelWeights levelWeights;
in vec4 fs_position;
in vec2 fs_uv;
@@ -64,11 +64,13 @@ Fragment getFragment() {
frag.color = vec4(1,1,1,1);
//LevelWeights levelWeights = getLevelWeights(levelInterpolationParameter);
#if USE_COLORTEXTURE
frag.color = calculateColor(
fs_uv,
levelInterpolationParameter,
levelWeights,
colorTiles,
colorTilesParent1,
colorTilesParent2);
@@ -81,7 +83,7 @@ Fragment getFragment() {
frag.color = calculateWater(
frag.color,
fs_uv,
levelInterpolationParameter,
levelWeights,
waterTiles,
waterTilesParent1,
waterTilesParent2);
@@ -94,7 +96,7 @@ Fragment getFragment() {
frag.color = calculateNight(
frag.color,
fs_uv,
levelInterpolationParameter,
levelWeights,
nightTiles,
nightTilesParent1,
nightTilesParent2,
@@ -111,14 +113,17 @@ Fragment getFragment() {
frag.color = calculateOverlay(
frag.color,
fs_uv,
levelInterpolationParameter,
levelWeights,
overlayTiles,
overlayTilesParent1,
overlayTilesParent2);
#endif // USE_OVERLAY
//frag.color += patchBorderOverlay(fs_uv, vec3(1,0,0), 0.02);
#if SHOW_CHUNK_EDGES
frag.color += patchBorderOverlay(fs_uv, vec3(1,0,0), 0.02);
#endif // SHOW_CHUNK_EDGES
frag.depth = fs_position.w;

View File

@@ -59,9 +59,7 @@ out vec2 fs_uv;
out vec4 fs_position;
out vec3 ellipsoidNormalCameraSpace;
// levelInterpolationParameter is used to interpolate between a tile and its parent tiles
// The value increases with the distance from the vertex (or fragment) to the camera
out float levelInterpolationParameter;
out LevelWeights levelWeights;
vec3 bilinearInterpolation(vec2 uv) {
// Bilinear interpolation
@@ -84,7 +82,8 @@ void main()
float projectedScaleFactor = distanceScaleFactor / distToVertexOnEllipsoid;
float desiredLevel = log2(projectedScaleFactor);
levelInterpolationParameter = chunkLevel - desiredLevel;
float levelInterpolationParameter = chunkLevel - desiredLevel;
levelWeights = getLevelWeights(levelInterpolationParameter);
#if USE_HEIGHTMAP
@@ -92,7 +91,7 @@ void main()
// Before any heightmapping is done
height = calculateHeight(
in_uv,
levelInterpolationParameter, // Variable to determine which texture to sample from
levelWeights, // Variable to determine which texture to sample from
heightTiles, heightTilesParent1, heightTilesParent2); // Three textures to sample from
#endif // USE_HEIGHTMAP

View File

@@ -29,78 +29,37 @@
#include <${MODULE_GLOBEBROWSING}/shaders/blending.hglsl>
// First layer type from LayeredTextureShaderProvider is height map
#ifndef NUMLAYERS_HEIGHTMAP
#define NUMLAYERS_HEIGHTMAP #{lastLayerIndexHeight} + 1
#endif // NUMLAYERS_HEIGHTMAP
#ifndef USE_HEIGHTMAP
#define USE_HEIGHTMAP #{useHeightMap}
#endif // USE_HEIGHTMAP
#ifndef HEIGHTMAP_BLENDING_ENABLED
#define HEIGHTMAP_BLENDING_ENABLED #{heightMapBlendingEnabled}
#endif // HEIGHTMAP_BLENDING_ENABLED
// Second layer type from LayeredTextureShaderProvider is color texture
#ifndef NUMLAYERS_COLORTEXTURE
#define NUMLAYERS_COLORTEXTURE #{lastLayerIndexColor} + 1
#endif // NUMLAYERS_COLORTEXTURE
#ifndef USE_COLORTEXTURE
#define USE_COLORTEXTURE #{useColorTexture}
#endif // USE_COLORTEXTURE
#ifndef COLORTEXTURE_BLENDING_ENABLED
#define COLORTEXTURE_BLENDING_ENABLED #{colorTextureBlendingEnabled}
#endif // COLORTEXTURE_BLENDING_ENABLED
// Third layer type from LayeredTextureShaderProvider is water mask
#ifndef NUMLAYERS_WATERMASK
#define NUMLAYERS_WATERMASK #{lastLayerIndexWater} + 1
#endif // NUMLAYERS_WATERMASK
#ifndef USE_WATERMASK
#define USE_WATERMASK #{useWaterMask}
#endif // USE_WATERMASK
#ifndef WATERMASK_BLENDING_ENABLED
#define WATERMASK_BLENDING_ENABLED #{waterMaskBlendingEnabled}
#endif // WATERMASK_BLENDING_ENABLED
// Fourth layer type from LayeredTextureShaderProvider is night texture
#ifndef NUMLAYERS_NIGHTTEXTURE
#define NUMLAYERS_NIGHTTEXTURE #{lastLayerIndexNight} + 1
#endif // NUMLAYERS_NIGHTTEXTURE
#ifndef USE_NIGHTTEXTURE
#define USE_NIGHTTEXTURE #{useNightTexture}
#endif // USE_NIGHTTEXTURE
#ifndef NIGHTTEXTURE_BLENDING_ENABLED
#define NIGHTTEXTURE_BLENDING_ENABLED #{nightTextureBlendingEnabled}
#endif // NIGHTTEXTURE_BLENDING_ENABLED
// Fifth layer type from LayeredTextureShaderProvider is overlay
#ifndef NUMLAYERS_OVERLAY
#define NUMLAYERS_OVERLAY #{lastLayerIndexOverlay} + 1
#endif // NUMLAYERS_OVERLAY
#ifndef USE_OVERLAY
#define USE_OVERLAY #{useOverlay}
#endif // USE_OVERLAY
#ifndef OVERLAY_BLENDING_ENABLED
#define OVERLAY_BLENDING_ENABLED #{overlayBlendingEnabled}
#endif // OVERLAY_BLENDING_ENABLED
// Other key value pairs used for settings
#ifndef USE_ATMOSPHERE
#define USE_ATMOSPHERE #{useAtmosphere}
#endif // USE_ATMOSPHERE
#define SHOW_CHUNK_EDGES #{showChunkEdges}
float calculateHeight(
const vec2 uv,
const float levelInterpolationParameter,
LevelWeights levelWeights,
const Tile heightTiles[NUMLAYERS_HEIGHTMAP],
const Tile heightTilesParent1[NUMLAYERS_HEIGHTMAP],
const Tile heightTilesParent2[NUMLAYERS_HEIGHTMAP]) {
@@ -109,10 +68,7 @@ float calculateHeight(
// The shader compiler will remove unused code when variables are multiplied by
// a constant 0
LevelWeights levelWeights;
#if HEIGHTMAP_BLENDING_ENABLED
levelWeights = getLevelWeights(levelInterpolationParameter);
#else // HEIGHTMAP_BLENDING_ENABLED
#if !HEIGHTMAP_BLENDING_ENABLED
levelWeights = getDefaultLevelWeights();
#endif // HEIGHTMAP_BLENDING_ENABLED
@@ -133,7 +89,7 @@ float calculateHeight(
vec4 calculateColor(
const vec2 uv,
const float levelInterpolationParameter,
LevelWeights levelWeights,
const Tile colorTiles[NUMLAYERS_COLORTEXTURE],
const Tile colorTilesParent1[NUMLAYERS_COLORTEXTURE],
const Tile colorTilesParent2[NUMLAYERS_COLORTEXTURE]) {
@@ -142,10 +98,7 @@ vec4 calculateColor(
// The shader compiler will remove unused code when variables are multiplied by
// a constant 0
LevelWeights levelWeights;
#if COLORTEXTURE_BLENDING_ENABLED
levelWeights = getLevelWeights(levelInterpolationParameter);
#else // COLORTEXTURE_BLENDING_ENABLED
#if !COLORTEXTURE_BLENDING_ENABLED
levelWeights = getDefaultLevelWeights();
#endif // COLORTEXTURE_BLENDING_ENABLED
@@ -166,7 +119,7 @@ vec4 calculateColor(
vec4 calculateNight(
const vec4 currentColor,
const vec2 uv,
const float levelInterpolationParameter,
LevelWeights levelWeights,
const Tile nightTiles[NUMLAYERS_NIGHTTEXTURE],
const Tile nightTilesParent1[NUMLAYERS_NIGHTTEXTURE],
const Tile nightTilesParent2[NUMLAYERS_NIGHTTEXTURE],
@@ -179,10 +132,7 @@ vec4 calculateNight(
// The shader compiler will remove unused code when variables are multiplied by
// a constant 0
LevelWeights levelWeights;
#if NIGHTTEXTURE_BLENDING_ENABLED
levelWeights = getLevelWeights(levelInterpolationParameter)
#else // NIGHTTEXTURE_BLENDING_ENABLED
#if !NIGHTTEXTURE_BLENDING_ENABLED
levelWeights = getDefaultLevelWeights();
#endif // NIGHTTEXTURE_BLENDING_ENABLED
@@ -206,7 +156,7 @@ vec4 calculateNight(
vec4 calculateOverlay(
const vec4 currentColor,
const vec2 uv,
const float levelInterpolationParameter,
LevelWeights levelWeights,
const Tile overlayTiles[NUMLAYERS_OVERLAY],
const Tile overlayTilesParent1[NUMLAYERS_OVERLAY],
const Tile overlayTilesParent2[NUMLAYERS_OVERLAY]) {
@@ -215,10 +165,7 @@ vec4 calculateOverlay(
// The shader compiler will remove unused code when variables are multiplied by
// a constant 0
LevelWeights levelWeights;
#if OVERLAY_BLENDING_ENABLED
levelWeights = getLevelWeights(levelInterpolationParameter);
#else // OVERLAY_BLENDING_ENABLED
#if !OVERLAY_BLENDING_ENABLED
levelWeights = getDefaultLevelWeights();
#endif // OVERLAY_BLENDING_ENABLED
@@ -239,7 +186,7 @@ vec4 calculateOverlay(
vec4 calculateWater(
const vec4 currentColor,
const vec2 uv,
const float levelInterpolationParameter,
LevelWeights levelWeights,
const Tile waterTiles[NUMLAYERS_WATERMASK],
const Tile waterTilesParent1[NUMLAYERS_WATERMASK],
const Tile waterTilesParent2[NUMLAYERS_WATERMASK]) {
@@ -248,10 +195,7 @@ vec4 calculateWater(
// The shader compiler will remove unused code when variables are multiplied by
// a constant 0
LevelWeights levelWeights;
#if WATERMASK_BLENDING_ENABLED
levelWeights = getLevelWeights(levelInterpolationParameter);
#else // WATERMASK_BLENDING_ENABLED
#if !WATERMASK_BLENDING_ENABLED
levelWeights = getDefaultLevelWeights();
#endif // WATERMASK_BLENDING_ENABLED