Integrated shaders into source.
This commit is contained in:
parent
ab879525ef
commit
efc4f2436f
@ -678,16 +678,87 @@ osg::Node* createShaderModel(osg::ref_ptr<osg::Image>& image_3d, osg::ref_ptr<os
|
|||||||
stateset->setAttribute(program);
|
stateset->setAttribute(program);
|
||||||
|
|
||||||
// get shaders from source
|
// get shaders from source
|
||||||
program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, osgDB::findDataFile("volume.vert")));
|
std::string vertexShaderFile = osgDB::findDataFile("volume.vert");
|
||||||
program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile("volume.frag")));
|
if (!vertexShaderFile.empty())
|
||||||
|
{
|
||||||
|
program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, vertexShaderFile));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char vertexShaderSource[] =
|
||||||
|
"varying vec3 texcoord;\n"
|
||||||
|
"varying vec3 deltaTexCoord;\n"
|
||||||
|
"\n"
|
||||||
|
"void main(void)\n"
|
||||||
|
"{\n"
|
||||||
|
" texcoord = gl_MultiTexCoord0.xyz;\n"
|
||||||
|
" gl_Position = ftransform(); \n"
|
||||||
|
" deltaTexCoord = normalize(gl_ModelViewMatrixInverse * vec4(0,0,0,1) - gl_Vertex);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
osg::Shader* vertex_shader = new osg::Shader(osg::Shader::VERTEX, vertexShaderSource);
|
||||||
|
program->addShader(vertex_shader);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string fragmentShaderFile = osgDB::findDataFile("volume.frag");
|
||||||
|
if (!fragmentShaderFile.empty())
|
||||||
|
{
|
||||||
|
program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, fragmentShaderFile));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//////////////////////////////////////////////////////////////////
|
||||||
|
// fragment shader
|
||||||
|
//
|
||||||
|
char fragmentShaderSource[] =
|
||||||
|
"uniform sampler3D baseTexture;\n"
|
||||||
|
"uniform float sampleDensity;\n"
|
||||||
|
"uniform float transparency;\n"
|
||||||
|
"uniform float alphaCutOff;\n"
|
||||||
|
"\n"
|
||||||
|
"varying vec3 deltaTexCoord;\n"
|
||||||
|
"varying vec3 texcoord;\n"
|
||||||
|
"void main(void) \n"
|
||||||
|
"{ \n"
|
||||||
|
" vec3 deltaTexCoord2 = normalize(deltaTexCoord)*sampleDensity; \n"
|
||||||
|
"\n"
|
||||||
|
" gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); \n"
|
||||||
|
" \n"
|
||||||
|
" while (texcoord.x>=0.0 && texcoord.x<=1.0 &&\n"
|
||||||
|
" texcoord.y>=0.0 && texcoord.y<=1.0 &&\n"
|
||||||
|
" texcoord.z>=0.0 && texcoord.z<=1.0)\n"
|
||||||
|
" {\n"
|
||||||
|
" vec4 color = texture3D( baseTexture, texcoord);\n"
|
||||||
|
" float r = color[3]*transparency;\n"
|
||||||
|
" if (r>alphaCutOff)\n"
|
||||||
|
" {\n"
|
||||||
|
" gl_FragColor.xyz = gl_FragColor.xyz*(1.0-r)+color.xyz*r;\n"
|
||||||
|
" gl_FragColor.w += r;\n"
|
||||||
|
" }\n"
|
||||||
|
" texcoord += deltaTexCoord2; \n"
|
||||||
|
" }\n"
|
||||||
|
" if (gl_FragColor.w>1.0) gl_FragColor.w = 1.0; \n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource);
|
||||||
|
program->addShader(fragment_shader);
|
||||||
|
}
|
||||||
|
|
||||||
osg::Uniform* baseTextureSampler = new osg::Uniform("baseTexture",0);
|
osg::Uniform* baseTextureSampler = new osg::Uniform("baseTexture",0);
|
||||||
stateset->addUniform(baseTextureSampler);
|
stateset->addUniform(baseTextureSampler);
|
||||||
|
|
||||||
osg::Uniform* deltaTexCoord = new osg::Uniform("deltaTexCoord",osg::Vec3(0.0f,0.0f,1.0f/256.0f));
|
osg::Uniform* sampleDensity = new osg::Uniform("sampleDensity", 1.0f/(float)numSlices);
|
||||||
stateset->addUniform(deltaTexCoord);
|
stateset->addUniform(sampleDensity);
|
||||||
|
|
||||||
|
osg::Uniform* transpancy = new osg::Uniform("transparency",0.5f);
|
||||||
|
stateset->addUniform(transpancy);
|
||||||
|
|
||||||
|
osg::Uniform* alphaCutOff = new osg::Uniform("alphaCutOff",alphaFuncValue);
|
||||||
|
stateset->addUniform(alphaCutOff);
|
||||||
|
|
||||||
|
stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON);
|
||||||
|
|
||||||
#if 1
|
|
||||||
{
|
{
|
||||||
osg::Geometry* geom = new osg::Geometry;
|
osg::Geometry* geom = new osg::Geometry;
|
||||||
|
|
||||||
@ -738,31 +809,29 @@ osg::Node* createShaderModel(osg::ref_ptr<osg::Image>& image_3d, osg::ref_ptr<os
|
|||||||
drawElements->push_back(4);
|
drawElements->push_back(4);
|
||||||
|
|
||||||
// right
|
// right
|
||||||
|
drawElements->push_back(5);
|
||||||
|
drawElements->push_back(6);
|
||||||
drawElements->push_back(2);
|
drawElements->push_back(2);
|
||||||
drawElements->push_back(1);
|
drawElements->push_back(1);
|
||||||
drawElements->push_back(5);
|
|
||||||
drawElements->push_back(6);
|
|
||||||
|
|
||||||
// front
|
// front
|
||||||
drawElements->push_back(0);
|
|
||||||
drawElements->push_back(1);
|
drawElements->push_back(1);
|
||||||
drawElements->push_back(5);
|
drawElements->push_back(0);
|
||||||
drawElements->push_back(4);
|
drawElements->push_back(4);
|
||||||
|
drawElements->push_back(5);
|
||||||
|
|
||||||
// top
|
// top
|
||||||
drawElements->push_back(6);
|
|
||||||
drawElements->push_back(7);
|
drawElements->push_back(7);
|
||||||
drawElements->push_back(4);
|
drawElements->push_back(6);
|
||||||
drawElements->push_back(5);
|
drawElements->push_back(5);
|
||||||
|
drawElements->push_back(4);
|
||||||
|
|
||||||
geom->addPrimitiveSet(drawElements);
|
geom->addPrimitiveSet(drawElements);
|
||||||
|
|
||||||
geode->addDrawable(geom);
|
geode->addDrawable(geom);
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
geode->addDrawable(osg::createTexturedQuadGeometry(osg::Vec3(0,0,0),osg::Vec3(1.0,0.0,0.0),osg::Vec3(0.0,1.0,0.0)));
|
|
||||||
#endif
|
|
||||||
return geode;
|
return geode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user