Show
Ignore:
Timestamp:
09/05/05 12:40:04 (9 years ago)
Author:
robert
Message:

Integrated shaders into source.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgvolume/osgvolume.cpp

    r4500 r4501  
    679679 
    680680    // get shaders from source 
    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    } 
    683747 
    684748    osg::Uniform* baseTextureSampler = new osg::Uniform("baseTexture",0); 
    685749    stateset->addUniform(baseTextureSampler); 
    686750 
    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 
    691762    { 
    692763        osg::Geometry* geom = new osg::Geometry; 
     
    739810 
    740811        // right 
     812        drawElements->push_back(5); 
     813        drawElements->push_back(6); 
    741814        drawElements->push_back(2); 
    742815        drawElements->push_back(1); 
     816 
     817        // front 
     818        drawElements->push_back(1); 
     819        drawElements->push_back(0); 
     820        drawElements->push_back(4); 
    743821        drawElements->push_back(5); 
     822 
     823        // top 
     824        drawElements->push_back(7); 
    744825        drawElements->push_back(6); 
    745  
    746         // front 
    747         drawElements->push_back(0); 
    748         drawElements->push_back(1); 
    749826        drawElements->push_back(5); 
    750827        drawElements->push_back(4); 
    751828 
    752         // top 
    753         drawElements->push_back(6); 
    754         drawElements->push_back(7); 
    755         drawElements->push_back(4); 
    756         drawElements->push_back(5); 
    757  
    758829        geom->addPrimitiveSet(drawElements); 
    759830 
     
    761832 
    762833    }  
    763 #else 
    764         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))); 
    765 #endif 
     834 
    766835    return geode; 
    767836}