osgFX.Technique是OpenSceneGraph中osgFX库中的一个重要类。它主要用于指定在一个Geometry的渲染过程中使用的渲染技术(technique)。
渲染技术包括顶点着色器(vertex shader)、片段着色器(fragment shader)、纹理(texture)、深度测试(depth test)、混合(blend)和剔除(cull)等。
osgFX.Technique主要由四个部分组成:
name是osgFX.Technique的一个公共变量,代表渲染技术的名称。
std::string name;
osgFX.Technique包含一个状态设置对象,用于保存要应用于渲染过程的状态设置。Stateset是osg::StateSet类的一个子类,其用法和osg::StateSet基本相同。
osg::ref_ptr<osg::StateSet> stateset;
shaderProgram代表了用于实现渲染过程的shader程序。它是osg::ShaderProgram类的一个实例。
osg::ref_ptr<osg::ShaderProgram> shaderProgram;
osgFX.Technique包含一个渲染过程列表,其中每个渲染过程(pass)代表了一个渲染状态及其相应的效果。pass的效果通过shaderProgram来实现。PassList是osgFX::PassList类的一个实例。
osg::ref_ptr<osgFX::PassList> passList;
使用osgFX.Technique时,我们需要将它与Geometry绑定,这样它才能生效。
osg::ref_ptr<osgFX::Technique> technique = new osgFX::Technique;
technique->name = "MyTechnique";
// 设置渲染过程
osg::ref_ptr<osgFX::Pass> pass = new osgFX::Pass;
pass->setShaderProgram(new osg::ShaderProgram);
// ... 给ShaderProgram设置Shader代码 ...
technique->passList->addPass(pass);
// 设置渲染状态
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
// ... 添加渲染状态 ...
technique->stateset = stateset;
// 应用到Geometry
osg::ref_ptr<osg::Node> node = readNodeFile("my_geometry.osg");
osg::StateSet* ss = node->getOrCreateStateSet();
ss->addUniform(new osg::Uniform("MyUniform", 1));
ss->addUniform(new osg::Uniform("MySecondUniform", 2));
ss->addTechnique(technique);