Thanks for the reply Alex. My setup is exactly as you describe but I'm still
having troubles. I've taken the essential bits of my code to create a sample
main() to illustrate exactly what I'm doing:
Code:
int main(int argc, char* argv[])
{
//INITIAL SETUP
//create root
osg::ref_ptr<osg::Group> root = new osg::Group();
//load osg-dem generated ive terrain complex
osg::ref_ptr<osg::Node> terrainNode =
osgDB::readNodeFile("terrain.ive");
//attach terrain node to root
root->addChild(terrainNode);
//create stateSet from terrainNode
osg::StateSet *state = terrainNode->getOrCreateStateSet();
//create program
osg::Program *program = new osg::Program;
//create shaders
osg::Shader *vertObj = new osg::Shader( osg::Shader::VERTEX );
osg::Shader *fragObj = new osg::Shader( osg::Shader::FRAGMENT );
//add shaders to program
program->addShader( fragObj );
program->addShader( vertObj );
//load shader src files into shaders
vertObj->loadShaderSourceFromFile( "shader.vert" );
fragObj->loadShaderSourceFromFile( "shader.frag" );
//CREATE LOOKUP TABLE AND IMAGE
//allocate memory for 4 by 4 lookup table
int height=4;
int width=4;
const int size = width*height*4;//*4 for rgba channels
unsigned char* data = (unsigned char*)calloc(size, sizeof(unsigned
char));
//Store arbitrary value of unsigned char 101 in each rgba channel in a
flattened 1D data array
int dataIndex;
for( int i=0 ; i < height ; i++ ){
for( int j=0 ; j < width ; j++ ){
dataIndex = i*width*4 + j*4;
data[dataIndex] = 101;//red
data[dataIndex+1] = 101;//green
data[dataIndex+2] = 101;//blue
data[dataIndex+3] = 101;//alpha
}
}
//create image
osg::ref_ptr<osg::Image> image = new osg::Image;
image->setOrigin(osg::Image::BOTTOM_LEFT);
image->setImage(width, height, 1 ,GL_RGBA,GL_RGBA,GL_UNSIGNED_BYTE,
(unsigned char*)data,osg::Image::NO_DELETE);
//create texture2D and add image to it
osg::ref_ptr<osg::Texture2D> lutTexture = new osg::Texture2D;
lutTexture->setTextureSize(width, height);//unsure if this is needed or
if it's inherited from the setImage function below
lutTexture->setInternalFormat(GL_RGBA);//unsure if this is needed or if
it's inherited from the setImage function below
lutTexture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST);
lutTexture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);
lutTexture->setImage(image);
//assign texture to hardcoded texture unit 1 so that it can be accessed
in the shader
const unsigned int TEXTURE_UNIT = 1;
state->setTextureAttributeAndModes(TEXTURE_UNIT, lutTexture,
osg::StateAttribute::ON);
state->addUniform(new osg::Uniform("lut", TEXTURE_UNIT));
//attach the program to the stateSet
state->setAttributeAndModes(program, osg::StateAttribute::ON);
//open an osgviewer to see the root
osgViewer::Viewer viewer;
viewer.setSceneData(root);
viewer.setLightingMode(osg::View::NO_LIGHT);
viewer.setCameraManipulator(new osgGA::TrackballManipulator);
viewer.home();
return viewer.run();
}
and here are the vert and frag shaders:
shader.vert
Code:
void main(void)
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1; //unsure if this is needed?
gl_FrontColor = gl_Color;
gl_Position = ftransform();
}
shader.frag
Code:
uniform sampler2D lut;
uniform sampler2D baseTexture;
void main(void)
{
//get color of the terrain's texture
vec4 color = texture2D(baseTexture, gl_TexCoord[0].st);
//find index value from data in the rgb channels of the terrain's
texture. (left out complicated equations since they are relevant, but I've
tested that their values are between 0-1
float index1 = some indexing logic here;
float index2 = some more index logic here;
//Look up new color values from lookup texture based on indices
vec2 lutCoord = vec2(index1, index2);
gl_FragColor = texture2D(lut, lutCoord);
}
So, if I create an image that has all values of rgba set to unsigned char=101,
I would expect that if I lookup values in that texture that they should always
be equal to rgba=(101,101,101,101) as long as my lutCoords are both between
0.0-1.0. However when I actually run this code the terrain texture is not all
the same color and I get this error on the command line:
"Warning: detected OpenGL error 'invalid operation' at After Renderer:compile"
By adding/removing things from my frag shader I have seen that this error shows
up whenever I try to use the values that I get back from the texture2d(lut,
lutCoord) command in any computational sense, e.g. if I set those colors to
gl_FragColor. If I did this instead I don't get errors:
Code:
vec4 test = texture2D(lut, lutCoords);
gl_FragColor = color;
Once I figure out why I'm getting this OpenGL error I will replace the lookup
table numbers with meaningful values. I will also use GL_LUMINANCE to store a
single 32 bit float instead of filling the rgba channels with 4x unsigned ints,
but for testing purposes I wanted to use something simple and easy to
understand conceptually.
So, I know this is a lot of code, but anyone have any thoughts on this? I'm
hoping that I just made some small and obvious error...
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=45537#45537
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org