Пользовательский glBlendFunc намного медленнее, чем родной - PullRequest
0 голосов
/ 14 августа 2011

Я пытаюсь сделать свой собственный glBlendFunc с помощью фрагментных шейдеров, однако мое решение намного медленнее, чем собственный glBlendFunc, даже когда они выполняют точную функцию смешивания.

Мне было интересно, есть ли у кого-нибудь предложения о том, как сделать это более эффективным способом.

Мое решение работает примерно так:

void draw(fbo fbos[2], render_item item)
{
   // fbos[0] is the render target
   // fbos[1] is the previous render target used to read "background" to blend against in shader
   // Both fbos have exactly the same content, however they need to be different since we can't both read and write to the same texture. The texture we render to needs to have the entire content since we might not draw geometry everywhere.

   fbos[0]->attach(); // Attach fbo
   fbos[1]->bind(1); // Bind as texture 1

   render(item);

   glCopyTexSubImage2D(...); // copy from fbos[0] to fbos[1], fbos[1] == fbos[0]
} 

fragment.glsl

vec4 blend_color(vec4 fore) 
{   
    vec4 back = texture2D(background, gl_TexCoord[1].st); // background is read from texture "1"
    return vec4(mix(back.rgb, fore.rgb, fore.a), back.a + fore.a);  
}

Ответы [ 2 ]

3 голосов
/ 14 августа 2011

Лучшая ставка для улучшения производительности смешивания на основе FBO - NV_texture_barrier .Несмотря на название, AMD также внедрила его, поэтому, если вы придерживаетесь карт Radeon HD-класса, он должен быть вам доступен.

По сути, он позволяет вам пинг-понг без таких тяжелых операций, как привязка FBOили операции прикрепления текстуры.Спецификация имеет раздел внизу, который показывает общий алгоритм.

Другой альтернативой является EXT_shader_image_load_store .Для этого потребуется оборудование класса DX11 / GL 4.x.OpenGL 4.2 недавно продвинул это в ядро ​​с ARB_shader_image_load_store .

Даже с этим, как сказала Дарси, вы никогда не будете побеждать регулярное смешивание.Он использует специальные аппаратные структуры, к которым шейдеры не могут получить доступ (поскольку они происходят после запуска шейдеров).Вы должны выполнять программное смешивание только в том случае, если есть какой-то эффект, который вы абсолютно не можете выполнить каким-либо другим способом.

2 голосов
/ 14 августа 2011

Это намного эффективнее, потому что операции смешивания встроены непосредственно в аппаратное обеспечение графического процессора, поэтому вы, вероятно, не сможете превзойти его по скорости. Сказав это, убедитесь, что у вас отключены тестирование глубины, выборка на задней панели, смешивание аппаратных средств и любые другие ненужные операции. Я не могу сказать, что это будет иметь огромное значение, но оно может иметь некоторые последствия.

...