Скрипты материалов для огров; Как я могу дать технике несколько lod_indexes? - PullRequest
2 голосов
/ 05 января 2010

У меня есть сценарий материала Огр , который определяет 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
}


Дополнительная информация

В руководстве к огру говорится;

Увеличение индексов означает более низкие уровни детализации

Вы можете (и часто будете) назначать более чем одну технику для одного и того же индекса LOD , это означает, что OGRE выберет 'лучшую технику из тех, которые перечислены в том же индексе LOD.

OGRE определяет, какой из них «лучший», по которому он указан первым.

В настоящее время на компьютере, поддерживающем версию GLSL, которую я использую, скрипт работает следующим образом;

  • Камера> 2000: шейдерная техника
  • Камера> 1600 <= 2000: Средняя // Здесь выбирается моя техника "текстуры" вместо шейдера </li>
  • Камера <= 1600: высокая // </li>

Если я изменю порядок 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 голосов
/ 05 марта 2014

Ваш подход с разными методами для разных значений 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
    }
}
}
...