| 681 | | program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, osgDB::findDataFile("volume.vert"))); |
| 682 | | program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, osgDB::findDataFile("volume.frag"))); |
| | 681 | std::string vertexShaderFile = osgDB::findDataFile("volume.vert"); |
| | 682 | if (!vertexShaderFile.empty()) |
| | 683 | { |
| | 684 | program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, vertexShaderFile)); |
| | 685 | } |
| | 686 | else |
| | 687 | { |
| | 688 | char vertexShaderSource[] = |
| | 689 | "varying vec3 texcoord;\n" |
| | 690 | "varying vec3 deltaTexCoord;\n" |
| | 691 | "\n" |
| | 692 | "void main(void)\n" |
| | 693 | "{\n" |
| | 694 | " texcoord = gl_MultiTexCoord0.xyz;\n" |
| | 695 | " gl_Position = ftransform(); \n" |
| | 696 | " deltaTexCoord = normalize(gl_ModelViewMatrixInverse * vec4(0,0,0,1) - gl_Vertex);\n" |
| | 697 | "}\n"; |
| | 698 | |
| | 699 | osg::Shader* vertex_shader = new osg::Shader(osg::Shader::VERTEX, vertexShaderSource); |
| | 700 | program->addShader(vertex_shader); |
| | 701 | |
| | 702 | } |
| | 703 | |
| | 704 | std::string fragmentShaderFile = osgDB::findDataFile("volume.frag"); |
| | 705 | if (!fragmentShaderFile.empty()) |
| | 706 | { |
| | 707 | program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, fragmentShaderFile)); |
| | 708 | } |
| | 709 | else |
| | 710 | { |
| | 711 | ////////////////////////////////////////////////////////////////// |
| | 712 | // fragment shader |
| | 713 | // |
| | 714 | char fragmentShaderSource[] = |
| | 715 | "uniform sampler3D baseTexture;\n" |
| | 716 | "uniform float sampleDensity;\n" |
| | 717 | "uniform float transparency;\n" |
| | 718 | "uniform float alphaCutOff;\n" |
| | 719 | "\n" |
| | 720 | "varying vec3 deltaTexCoord;\n" |
| | 721 | "varying vec3 texcoord;\n" |
| | 722 | "void main(void) \n" |
| | 723 | "{ \n" |
| | 724 | " vec3 deltaTexCoord2 = normalize(deltaTexCoord)*sampleDensity; \n" |
| | 725 | "\n" |
| | 726 | " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); \n" |
| | 727 | " \n" |
| | 728 | " while (texcoord.x>=0.0 && texcoord.x<=1.0 &&\n" |
| | 729 | " texcoord.y>=0.0 && texcoord.y<=1.0 &&\n" |
| | 730 | " texcoord.z>=0.0 && texcoord.z<=1.0)\n" |
| | 731 | " {\n" |
| | 732 | " vec4 color = texture3D( baseTexture, texcoord);\n" |
| | 733 | " float r = color[3]*transparency;\n" |
| | 734 | " if (r>alphaCutOff)\n" |
| | 735 | " {\n" |
| | 736 | " gl_FragColor.xyz = gl_FragColor.xyz*(1.0-r)+color.xyz*r;\n" |
| | 737 | " gl_FragColor.w += r;\n" |
| | 738 | " }\n" |
| | 739 | " texcoord += deltaTexCoord2; \n" |
| | 740 | " }\n" |
| | 741 | " if (gl_FragColor.w>1.0) gl_FragColor.w = 1.0; \n" |
| | 742 | "}\n"; |
| | 743 | |
| | 744 | osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT, fragmentShaderSource); |
| | 745 | program->addShader(fragment_shader); |
| | 746 | } |
| 687 | | osg::Uniform* deltaTexCoord = new osg::Uniform("deltaTexCoord",osg::Vec3(0.0f,0.0f,1.0f/256.0f)); |
| 688 | | stateset->addUniform(deltaTexCoord); |
| 689 | | |
| 690 | | #if 1 |
| | 751 | osg::Uniform* sampleDensity = new osg::Uniform("sampleDensity", 1.0f/(float)numSlices); |
| | 752 | stateset->addUniform(sampleDensity); |
| | 753 | |
| | 754 | osg::Uniform* transpancy = new osg::Uniform("transparency",0.5f); |
| | 755 | stateset->addUniform(transpancy); |
| | 756 | |
| | 757 | osg::Uniform* alphaCutOff = new osg::Uniform("alphaCutOff",alphaFuncValue); |
| | 758 | stateset->addUniform(alphaCutOff); |
| | 759 | |
| | 760 | stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON); |
| | 761 | |