From efc4f2436fbca789b28949d70c304f92910452d2 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 5 Sep 2005 10:40:04 +0000 Subject: [PATCH] Integrated shaders into source. --- examples/osgvolume/osgvolume.cpp | 97 +++++++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 14 deletions(-) diff --git a/examples/osgvolume/osgvolume.cpp b/examples/osgvolume/osgvolume.cpp index fdafccd3c..f8a067823 100644 --- a/examples/osgvolume/osgvolume.cpp +++ b/examples/osgvolume/osgvolume.cpp @@ -678,16 +678,87 @@ osg::Node* createShaderModel(osg::ref_ptr& image_3d, osg::ref_ptrsetAttribute(program); // get shaders from source - program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, osgDB::findDataFile("volume.vert"))); - program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile("volume.frag"))); + std::string vertexShaderFile = osgDB::findDataFile("volume.vert"); + 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); stateset->addUniform(baseTextureSampler); - osg::Uniform* deltaTexCoord = new osg::Uniform("deltaTexCoord",osg::Vec3(0.0f,0.0f,1.0f/256.0f)); - stateset->addUniform(deltaTexCoord); + osg::Uniform* sampleDensity = new osg::Uniform("sampleDensity", 1.0f/(float)numSlices); + 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; @@ -738,31 +809,29 @@ osg::Node* createShaderModel(osg::ref_ptr& image_3d, osg::ref_ptrpush_back(4); // right + drawElements->push_back(5); + drawElements->push_back(6); drawElements->push_back(2); drawElements->push_back(1); - drawElements->push_back(5); - drawElements->push_back(6); // front - drawElements->push_back(0); drawElements->push_back(1); - drawElements->push_back(5); + drawElements->push_back(0); drawElements->push_back(4); + drawElements->push_back(5); // top - drawElements->push_back(6); drawElements->push_back(7); - drawElements->push_back(4); + drawElements->push_back(6); drawElements->push_back(5); + drawElements->push_back(4); geom->addPrimitiveSet(drawElements); 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; }