- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试通过片段着色器执行我自己的自定义 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/
OpenGL 的 glBlendFunc 中有没有办法放大目标 RGB? (即(10,50,5)到(20,100,10) 看来你唯一能做的就是添加源 rgb(乘以 <1 的一些因素) 最佳答案 如果您
我需要保留当前的 GlBlendFunc 以便在我做一些工作后可以恢复它。似乎这不是可以用 GLPushAttrib 保存的属性之一,还有其他类似的方法可以用来保存状态吗? 最佳答案 glGet与
我有一个非常简单的着色器(只需将背景方块设置为绿色),这非常有效。 我最近添加了一些应用了纹理的四边形。这个纹理有一些 alpha 值,所以我用它来称呼它: glEnable (GL_BLEN
我希望我的线条用负色绘制(从线条下方的屏幕上获取),我只是不明白混合是如何工作的,看了文档等,测试了 50 种组合等等。开始认为这根本不可能...... 谁能给出这两个值? 最佳答案 画一条白线并使用
我正在尝试通过片段着色器执行我自己的自定义 glBlendFunc,但是,我的解决方案比原生 glBlendFunc 慢很多,即使它们执行精确的混合功能也是如此。 我想知道是否有人对如何以更有效的方式
我在 OpenGl 中创建了一个运行良好的粒子系统。当我想要获得火焰或光束或其他东西的燃烧效果时(系统有点“发光”并将所有颜色融合在一起)我使用 OpenGL 调用此方法。 glBlendFunc(G
我正在使用 glBindFragDataLocationIndexed() 并在片段着色器中写入两种颜色。以下是我的代码: glBindFragDataLocationIndexed(shader_d
我应该使用什么 glBlendFunc 来确保我的绘图的不透明度始终相同?当我使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 并在彼此之上绘制
在尝试了 glBlendFunc 的各种组合后,我注意到大多数组合对我的手机 (HTC Desire) 没有任何影响,而它们在模拟器中工作得很好。在手机上,只有0+1、1+0、1+1有任何明显的效果,
我正在尝试使用以下方法渲染一些透明对象: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 但是,我没有得到我想要的结果。 我画了一个完全不透明的正
我想知道 glBlendFunc 是如何工作的。例如,我有 2 个 gl 纹理,alpha 在 tex1 上,我想在我的最终图像中有 alpha。 tex1 的颜色,我希望 tex2 的颜色。 最佳答
在 OpenGL 中,为了获得适当的透明度效果,我应该使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)但是使用该混合函数 glClearColo
我正在尝试渲染方形边框(可变厚度,因此线条不起作用)。我在想 4 个四边形就可以了(所有的尺寸都一样,只是每边旋转和平移)。然后我想,应该用 2 个四边形来做——画一个然后在中间画一个小的。然而,我实
标题看起来有点神秘,但我无法在那里真正解释我想做什么,所以我画了一张图来形象化我的问题: 黑色部分是透明的(又名 alpha = 0)。我在帧缓冲区中有蓝色对象(左),我想在其上渲染白色位图(中),使
编辑:更改片段着色器,以便每次运行只能有一个光源解决了我的第一个问题。我的第二个问题仍然存在。 在此先感谢您提供的任何帮助。我已经为我的LWJGL渲染引擎开发了一个延迟着色管道,现在已经有几个星期了。
我将 GLKit 用于 iPad 应用程序。使用此代码,我设置了混合: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_A
在我的程序中,我想在带纹理的背景上绘制一个正方形(具有不同的不透明度,为了论证起见,可以说是红色)。然而,根据背景,正方形显示出错误的颜色。当 alpha=1.0f(不透明)时,正方形应显示为红色,在
我正在绘制非纹理三角形,其 alpha 在像素着色器中被明确设置为 0.5 以用于测试目的。我的应用程序基于 Xcode 提供的 Opengl ES 预制件。我没有触及我的 EAGLView 类。 我
我有一个简单的单 channel (8 位)位图,仅包含亮度数据,我想将其与现有帧缓冲区混合就像在 Photoshop 中的屏幕混合模式一样。 因此,源的白色像素 (255) 应产生白色,源的 50%
我不确定 glBlendFunc 是否是解决我问题的好函数,但我认为我会需要它!这是我的问题: 你看到右边那两棵松树的倒影了吗?我想要这样的东西: 然后,我需要一种方法来显示与不透明图像相同的显示,但
我是一名优秀的程序员,十分优秀!