食人魔材料脚本;我如何给多个lod_indexes技术?

时间:2010-01-05 15:44:13

标签: graphics glsl ogre

我有一个Ogre材质脚本,定义了4种渲染技术。 1使用GLSL着色器,然后另外3个只使用不同分辨率的纹理。
我想无条件地使用GLSL着色器,如果显卡支持它,其他3纹理取决于相机距离。

目前我的剧本是;

material foo
{
lod_distances 1600 2000

technique shaders
{
     lod_index 0
     lod_index 1
     lod_index 2

     //various passes here
}

technique high_res {
     lod_index 0
     //various passes here
}

technique medium_res {
     lod_index 1
     //various passes here
}

technique low_res {
     lod_index 2
     //various passes here
}


额外信息

Ogre manual说;

  

增加索引表示较低的细节级别

     

您可以(并且经常会)将多种技术分配给相同的LOD索引,这意味着OGRE将选择“在同一LOD索引中列出的最佳技术”。

     

OGRE确定哪一个是“最好的”,首先列出哪一个。

目前,在支持我正在使用的GLSL版本的机器上,脚本的行为如下:

  • 相机> 2000年:着色技术
  • 相机> 1600< = 2000:中等//这里正在选择我的“纹理”技术而不是着色器
  • 相机< = 1600:高//

如果我将着色器技术中的lod顺序更改为

{
     lod_index 2
     lod_index 1
     lod_index 0
}

仅使用最新的lod_index。


如果我将其更改为

lod_index 0 1 2

对我大喊大叫

 Compiler error: fewer parameters expected in foo.material(#): lod_index only supports 1 argument

那么如何指定一种技术来拥有3个lod_indexes?

复制工作;

technique shaders
{
     lod_index 0
     //Shader passes here
}


technique shaders1
{
     lod_index 1
     //DUPLICATE of shader passses in lod 0
}


technique shaders2
{
     lod_index 2
     //DUPLICATE of shader passses in lod 0
}

......但它太丑了。

1 个答案:

答案 0 :(得分:0)

使用不同技术处理不同LOD值的方法确实是正确的。具有材料LOD使用的完整示例文件将如下所示。

注意:您当然可以更改LOD策略以满足您的需求。所有有效的策略值及其行为都在Ogre手册中进行了解释。

material testLOD
{
lod_strategy screen_ratio_pixel_count
lod_values 0.8 0.6 0.4 0.2

technique red10
{
    pass red
    {
        ambient 0.698039 0.698039 0.698039 1
        diffuse 0.698039 0.698039 0.698039 1
        specular 0.898039 0.898039 0.898039 1 20
        emissive 1 0 0 1
    }
}

technique green20
{
    lod_index 1
    pass green
    {
        ambient 0.698039 0.698039 0.698039 1
        diffuse 0.698039 0.698039 0.698039 1
        specular 0.898039 0.898039 0.898039 1 20
        emissive 0 1 0 1
    }
}

technique cyan100
{
    lod_index 2
    pass cyan
    {
        ambient 0.698039 0.698039 0.698039 1
        diffuse 0.698039 0.698039 0.698039 1
        specular 0.898039 0.898039 0.898039 1 20
        emissive 0 0.945098 0.980392 1
    }
}

technique blue200
{
    lod_index 3
    pass blue
    {
        ambient 0.698039 0.698039 0.698039 1
        diffuse 0.698039 0.698039 0.698039 1
        specular 0.898039 0.898039 0.898039 1 20
        emissive 0 0 1 1
    }
}

technique yellow1000
{
    lod_index 4
    pass yellow
    {
        ambient 0.698039 0.698039 0.698039 1
        diffuse 0.698039 0.698039 0.698039 1
        specular 0.898039 0.898039 0.898039 1 20
        emissive 1 1 0 1
    }
}
}