2

我有一个定义 4 种渲染技术的Ogre材质脚本。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
}


额外的信息

食人魔手册说;

增加索引表示较低级别的详细信息

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

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

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

  • Camera > 2000 : 着色器技术
  • Camera >1600 <= 2000 : Medium // 这里选择我的“纹理”技术而不是着色器
  • 相机 <= 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
}

......但它很丑陋。

4

1 回答 1

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
    }
}
}
于 2014-03-05T11:03:25.227 回答