From 811d0e465a4d1d67980679db3f3dfc7fd5a13462 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 5 Apr 2007 14:56:30 +0000 Subject: [PATCH] Added better handling of colour layer/elevation layer/transfer function combinations and use of 16bit luminance format for colour layers used as input to transfer functions --- src/osgTerrain/GeometryTechnique.cpp | 124 +++++++++++++++++---------- 1 file changed, 81 insertions(+), 43 deletions(-) diff --git a/src/osgTerrain/GeometryTechnique.cpp b/src/osgTerrain/GeometryTechnique.cpp index 480fc7e97..8ce847ba4 100644 --- a/src/osgTerrain/GeometryTechnique.cpp +++ b/src/osgTerrain/GeometryTechnique.cpp @@ -49,6 +49,10 @@ void GeometryTechnique::init() osgTerrain::Layer* elevationLayer = _terrainNode->getElevationLayer(); osgTerrain::Layer* colorLayer = _terrainNode->getColorLayer(); osg::TransferFunction* colorTF = _terrainNode->getColorTransferFunction(); + + // if the elevationLayer and colorLayer are the same, and there is colorTF then + // simply assing as a texture coordinate. + if ((elevationLayer==colorLayer) && colorTF) colorLayer = 0; osg::notify(osg::NOTICE)<<"elevationLayer = "<setResizeNonPowerOfTwoHint(false); texture1D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST); texture1D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST); - stateset->setTextureAttributeAndModes(1, texture1D, osg::StateAttribute::ON); + stateset->setTextureAttributeAndModes(tf_index, texture1D, osg::StateAttribute::ON); - osg::Program* program = new osg::Program; - stateset->setAttribute(program); - - // get shaders from source - std::string vertexShaderFile = osgDB::findDataFile("lookup.vert"); - if (!vertexShaderFile.empty()) + if (colorLayer) { - program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, vertexShaderFile)); + osg::notify(osg::NOTICE)<<"Using fragment program"<setAttribute(program); + + // get shaders from source + std::string vertexShaderFile = osgDB::findDataFile("lookup.vert"); + if (!vertexShaderFile.empty()) + { + program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, vertexShaderFile)); + } + else + { + osg::notify(osg::NOTICE)<<"Not found lookup.vert"<addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, fragmentShaderFile)); + } + else + { + osg::notify(osg::NOTICE)<<"Not found lookup.frag"<addUniform(sourceSampler); + + osg::Uniform* lookupTexture = new osg::Uniform("lookupTexture",tf_index); + stateset->addUniform(lookupTexture); + + osg::Uniform* minValue = new osg::Uniform("minValue", tf->getMinimum()); + stateset->addUniform(minValue); + + osg::Uniform* inverseRange = new osg::Uniform("inverseRange", 1.0f/(tf->getMaximum()-tf->getMinimum())); + stateset->addUniform(inverseRange); } else { - osg::notify(osg::NOTICE)<<"Not found lookup.vert"<addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, fragmentShaderFile)); - } - else - { - osg::notify(osg::NOTICE)<<"Not found lookup.frag"<addUniform(sourceSampler); - - osg::Uniform* lookupTexture = new osg::Uniform("lookupTexture",1); - stateset->addUniform(lookupTexture); - - osg::Uniform* minValue = new osg::Uniform("minValue", tf->getMinimum()); - stateset->addUniform(minValue); - - osg::Uniform* inverseRange = new osg::Uniform("inverseRange", 1.0f/(tf->getMaximum()-tf->getMinimum())); - stateset->addUniform(inverseRange); } _dirty = false;