问题标签 [glblendfunc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Opengl Render To Texture With Partial Transparancy (Translucency) And Then Rendering That To The Screen
I've found a few places where this has been asked, but I've not yet found a good answer.
The problem: I want to render to texture, and then I want to draw that rendered texture to the screen IDENTICALLY to how It would appear if I skipped the render to texture step and were just directly rendering to the screen. I am currently using a blend mode glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). I have glBlendFuncSeparate to play around with as well.
I want to be able to render partially transparent overlapping items to this texture. I know the blend function is currently messing up the RGB values based on the Alpha. I've seen some vague suggestions to use "premultiplied alpha" but the description is poor as to what that means. I make png files in photoshop, I know they have a translucency bit and you can't easily edit the alpha channel independently as you can with TGA. If necessary I can switch to TGA, though PNG is more convenient.
For now, for the sake of this question, assume we aren't using images, instead I am just using full color quads with alpha.
Once I render my scene to the texture I need to render that texture to another scene, and I need to BLEND the texture assuming partial transparency again. Here is where things fall apart. In the previous blending steps I clearly alter the RGB values based on Alpha, doing it again works a-okay if Alpha is 0 or 1, but if it is in in between, the result is a further darkening of those partially translucent pixels.
Playing with blend modes I've had very little luck. The best I can do is render to texture with:
glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
I did discover that rendering multiple times with glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) will approximate the right color (unless things overlap). But that's not exactly perfect (as you can see in the following image, the parts where the green/red/blue boxes overlap gets darker, or accumulates alpha. (EDIT: If I do the multiple draws in the render to screen part and only render once to texture, the alpha accumulation issue disappears and it does work, but why?! I don't want to have to render the same texture hundreds of times to the screen to get it to accumulate properly)
Here are some images detailing the issue (the multiple render passes are with basic blending (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), and they are rendered multiple times in the texture rendering step. The 3 boxes on the right are rendered 100% red, green, or blue (0-255) but at alpha values of 50% for blue, 25% for red, and 75% for green:
So, a breakdown of what I want to know:
- I set blend mode to: X?
- I render my scene to a texture. (Maybe I have to render with a few blend modes or multiple times?)
- I set my blend mode to: Y?
- I render my texture to the screen over an existing scene. (Maybe I need a different shader? Maybe I need to render the texture a few times?)
Desired behavior is that at the end of that step, the final pixel result is identical to if I were to just do this:
- I set my blend mode to: (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
- I render my scene to the screen.
And, for completeness, here is some of my code with my original naive attempt (just regular blending):
Here is the code I'm using to set up the scene:
And the code to render the scene:
And here's my screen draw:
*EDIT: FRAMEBUFFER SETUP/TEARDOWN CODE:
And my clear screen code:
c++ - 如何实现自己的混合功能?
我想在不使用 OpenGL 的程序中实现以下混合功能。
在 OpenGL 实时测试应用程序中,我能够在白色背景上与此功能颜色混合。混合结果应类似于http://postimg.org/image/lwr9ossen/。我有一个白色背景,想在上面混合红点。高密度的红点应该是不透明的/黑色的。
我尝试了一些东西,但没有成功。有人知道这个混合函数的方程式吗?
ruby - Opengl,Ruby,glBlendFunc:将透明图像放在彼此之上,就好像它是不透明的一样
我不确定 glBlendFunc 是否是解决我的问题的好功能,但我认为我需要它!这是我的问题:
看到右边两棵松树的倒影了吗?我想要这样的东西:
然后,我需要一种与不透明图像显示相同但具有透明图像的方法。glBlendFunc 中是否有特殊组合,还是应该通过其他方式进行?
opengl-es - OpenGL ES 2.0 混合 alpha 限制
OpenGL ES 2.0 中是否有用于设置混合 alpha 值限制的混合方法?我想实现这样的效果:纹理在相互叠加时正常混合,直到达到 alpha 限制,此时混合的 alpha 值将停止增加。
cocos2d-x - cocos2d-x中如何使精灵的背景透明
我将从 Heroes III def 文件中提取图片。所有图片都提取为蓝色背景的 bmp 文件。我想在我的 cocos2d-x 项目中使用这些图片进行演示。
如何使用程序(GLBlendFunc 或 Shader?)使蓝色背景透明并选择阴影是否可见。
opengl - 发光粒子opengl
我的粒子没有发光。我在互联网上搜索它已经完成
这段代码改变了我的粒子,但它没有发光。任何人都可以看到我的代码有什么问题吗?以下是相关代码:
这是我希望我的 glutsolidspheres 成为的另一个示例: 光球(光,材料?) glutsolidsphere
opengl - libgdx - blendFunc 用于画笔画线?(添加剂/非添加剂混合物)
我在两点之间的一条线上的每一步都在每个像素的帧缓冲区中绘制精灵,但我在混合时遇到了问题:
我目前正在使用:
(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
然后,在我的着色器中,我这样做:
但是,如果您查看红色和绿色的星星,您可以看到发生在 alpha 介于 (0,1) 区间之间的“加法混合”。
如果没有添加混合,就会出现这种 3D 效果:
有没有办法对相似颜色进行加法混合,但在颜色不匹配时避免?
它应该如下所示:
c++ - 为什么使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE); 仍然会导致目标颜色发生变化?
我正在尝试使用 OpenGL 在 C++ 中开发一个粒子系统,但我对混合的工作原理感到困惑。我正在尝试使用加法混合,据我了解,使用以下参数调用 glBlendFunc 函数:
当您尝试渲染某些东西时会导致以下情况:它将采用片段着色器计算的 R、G、B 颜色(源颜色),乘以片段着色器计算的 alpha 值(源 alpha),然后添加到帧缓冲区中已经存在的 R、G、B 颜色(目标颜色)。但如果这是真的,那么由片段着色器计算的黑色,其中 (R,G,B,A) = (0,0,0,1) 应该保持现有帧缓冲区颜色(目标颜色)不变,因为它是将 0 的源颜色值乘以 1 的源 alpha 值,这显然应该总是产生 0,然后将该 0 添加到现有的帧缓冲区颜色(目标颜色)中,这应该保持不变......对吗?
但是,当我这样做时,它并没有保持颜色不变,而是使它变亮,如下所示:
在这张图中,环境和剑是用法线混合渲染的,然后用 glBlendFunc(GL_SRC_ALPHA, GL_ONE) 渲染剑周围的方形粒子;使用总是输出 (R,G,B,A) = (0,0,0,1) 的片段着色器。渲染了很多粒子,你可以看到随着更多的粒子重叠,它变得更亮。当我将着色器的 alpha 输出从 1 切换到 0(源 alpha)时,粒子就会消失,这是有道理的。但是为什么当源颜色=1 和源 alpha=0 时它们仍然可见?
这是我调用来渲染粒子的确切函数:
这些是我的片段着色器的最后 4 行,确保粒子颜色输出 (R,G,B,A) 始终 = (0,0,0,1):
有什么我想念的吗?
webgl - 在单个渲染过程中添加正负颜色片段的混合
我正在开发一个类似于粒子系统的WebGL项目。出于美学目的,我的单个渲染通道被配置为添加混合,并且我禁用了深度测试。为了争论,我还将我的视口缓冲区清除为50% gray 。
我已经将一个顶点缓冲区和索引缓冲区上传到 GPU,代表两个部分重叠的三角形。它们的顶点具有vec3 颜色属性。我为每个顶点分配了50% gray (0.5, 0.5, 0.5)的颜色。
当我用我的着色器绘制三角形时,我很高兴地报告说,我的视口缓冲区现在看起来是50% 灰色,有两个重叠的三角形区域是白色的。三角形是白色的,因为它们片段的颜色值与颜色缓冲区中已经存在的颜色值相加混合。
现在,我通过以下更改重新上传顶点缓冲区:第二个三角形的顶点颜色现在是-50% gray (-0.5, -0.5, -0.5)。
我希望完成的是,我的视口缓冲区看起来是50% 的灰色,有两个重叠的三角形区域——一个白色,一个黑色——它们相交,并在它们的交叉处产生50% 的灰色。毕竟,添加一个负数应该与减去一个相同数量级的正数相同。
相反,我看到的是一个50% 灰色的视口,只有一个三角形区域——白色区域。
我认为这是因为我的片段着色器的输出在与颜色缓冲区混合之前被限制在下限为零的范围内。我想知道如何规避这种限制——最好是在 WebGL 中,不需要多次渲染。
我将在此 URL 的页面源代码中测试解决方案:http ://rezmason.net/scourge/issues/positive_negative_fragments.html
更新
作为一项调查,我已经尝试在帧缓冲区中执行我的加法混合,然后通过将帧缓冲区纹理化为一个单元四边形来将帧缓冲区绘制到视口缓冲区——当然,这是两个单独的绘制调用,理想情况下我会这样做喜欢避免。
也就是说,因为我可以将帧缓冲区的格式显式设置为浮点数,所以当我在该缓冲区中执行操作时,任何值都不会发生钳位。当我将缓冲区绘制到视口时,我假设最终会发生夹紧,但到那时所有的混合都已经完成。
我的问题现在要简单得多:有什么方法可以初始化 WebGL 或 OpenGL 上下文,以便将其视口格式化为浮点缓冲区?