gpt4 book ai didi

c++ - 自定义 glBlendFunc 比原生慢很多

转载 作者:太空宇宙 更新时间:2023-11-04 16:30:58 25 4
gpt4 key购买 nike

我正在尝试通过片段着色器执行我自己的自定义 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]
}

片段.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);
}

最佳答案

提高基于 FBO 的混合性能的最佳选择是 NV_texture_barrier .尽管有这个名字,但 AMD 也实现了它,所以如果你坚持使用 Radeon HD 级显卡,它应该可供你使用。

基本上,它允许您在没有重量级操作(如 FBO 绑定(bind)或纹理附加操作)的情况下进行乒乓球。该规范底部有一节显示了通用算法。

另一种选择是 EXT_shader_image_load_store .这将需要 DX11/GL 4.x 级硬件。 OpenGL 4.2 最近通过 ARB_shader_image_load_store 将其提升为核心.

即便如此,正如 Darcy 所说,您也永远无法击败常规混合。它使用着色器无法访问的特殊硬件结构(因为它们发生在着色器运行之后)。只有在存在您绝对无法通过任何其他方式实现的效果时,您才应该进行程序化混合。

关于c++ - 自定义 glBlendFunc 比原生慢很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7054538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com