|
楼主 |
发表于 2010-1-4 11:31:51
|
显示全部楼层
麻烦帮我看一下我这个程序什么错误,运行出来一片黑。
(1)把查找表数据存成一张图片作为一维纹理
osg::ref_ptr<osg::Image> image = new osg::Image;
image->allocateImage(768,1,1,GL_RGBA,GL_FLOAT);
image->setInternalTextureFormat(GL_RGBA);
osg::Vec4* dataPtr = (osg::Vec4*)image->data();
for(int i=0;i<256;i++) //红色0-255对应的新值
{
*dataPtr++ = osg::Vec4(lutR[i],0.0,0.0,1.0f);
}
for(int i=0;i<256;i++)//绿色0-255对应的新值
{
*dataPtr++ = osg::Vec4(0.0,lutG[i],0.0,1.0f);
}
for(int i=0;i<256;i++)//蓝色0-255对应的新值
{
*dataPtr++ = osg::Vec4(0.0,0.0,lutB[i],1.0f);
}
osg::ref_ptr<osg::Texture1D> texture = new osg::Texture1D;
texture->setWrap(osg::Texture1D::WRAP_S,osg::Texture1D::MIRROR);
texture->setFilter(osg::Texture1D::MIN_FILTER,osg::Texture1D:INEAR);
texture->setImage(image.get());
(2)传参给着色器
osg::ref_ptr<osg::StateSet> state=new osg::StateSet(); //此状态集用来给着色器传参数,没有和任何节点关联,目的只是把查找表传给着色器
state->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
state->setTextureAttribute(0,texture,osg::StateAttribute::ON);
state->setTextureMode(0,GL_TEXTURE_1D,osg::StateAttribute::ON);
addVertexAndFragmentShaderFromFile("minimal.vert","minimal.frag", root.get()); //将着色器给根结点
state->addUniform(new osg::Uniform("lut",0));
(3)着色器内容
colorOut.r = texture1D(lut,colorIn.r).r;
colorOut.g = texture1D(lut,colorIn.g+256).g;
colorOut.b = texture1D(lut,colorIn.b+512).b;
colorOut.a = 1.0;
gl_FragColor = colorOut; |
|