2012-05-15 6 views
1

Я хочу визуализировать том (VERSION combined with programmable pipeline and fixed pipeline), используя только программируемый конвейер (без фиксированного конвейера), который использует glsl. Чтобы достичь этого, мне нужен многопроцессор рендеринга, который означает визуализацию другой сцены с разными шейдерами в последовательном порядке. Есть three methods приходят на ум:обрабатывать несколько проходов при рендеринге

  1. с помощью программы один шейдер и отсоединить шейдер -> присоединять шейдер -> Программа перекомпиляции всякий раз, когда рендеринг новой сцены.
  2. с использованием одной программы шейдера за проход, а затем выходит несколько программ шейдера.
  3. Использование подпрограмм в glsl для выбора различных подпрограмм при рендеринге другого прохода.

Интересно, когда следует использовать 1-й метод? 2ed метод? может ли любой опытный разработчик помочь?

ответ

1

Многие проблемы могут быть решены без нескольких проходов. Просто попробуйте сделать технику без них. Если ничего не работает использовать метод 3.

Мои мысли по этому поводу:

  • Метод 1 очень медленно и непригодной для использования.
  • Метод 2 - это много работы, но если сделано хорошо, это «быстро».
  • Способ 3 прост и изящный, но имеет дополнительные рабочие накладные расходы . Вы можете сделать свой объект несколько раз и передать свой текущий номер прохода в ваш шейдер.

Пример для метода 3:

uniform int currentPass; 

/* OTHER UNIFORMS */ 

void main() 
{ 
    if(currentPass == 1) 
    { 
     /* DO SOMETHING */ 
    } 
    else if(currentPass == 2) 
    { 
     /* DO SOMETHING */ 
    } 
    else if(...) { ... } 
} 

На мой взгляд, самый лучший подход заключается в использовании только очень немногие шейдеры (возможно, один материал шейдер, один пост обработки шейдеров и т.д.), так что ваш метод 3 почти идеальна.

Когда-либо думал о uber-шейдерах? Это что-то вроде вашего метода 3. Google it :) Я рекомендую также этот question.

Also be careful, the if-statements may weaken your performance very much.

+0

Я искал убер-шейдеры. но кажется, что в шейдерных файлах uber-shaders используют что-то вроде макросов '# ifdef' и' # endif'. Как я могу выбрать различные фрагменты шейдерных файлов в файлах шейдеров во время выполнения с помощью '# ifdef' и' # endif'? могу ли я установить макрос определения в моей программе OpenGL в функции «render()»? – toolchainX

+0

Нет, препроцессора нет, чтобы сделать что-то подобное. Вы должны использовать инструменты/библиотеки, такие как [Boost :: Wave] (http://www.boost.org/doc/libs/1_49_0/libs/wave/index.html), чтобы предварительно обработать код. После этого вы можете скомпилировать/выполнить шейдер. – pearcoding

+0

Но, возможно, это поможет вам: [externally-define-preprocessor-macros-in-glsl] (http://stackoverflow.com/questions/2378448/externally-define-preprocessor-macros-in-glsl) – pearcoding

Смежные вопросы