与OpenGL ES的条件混合
Conditional Blending with OpenGL ES
我想使用 OpenGL ES 3.1 实现满足以下要求的片段/混合操作:
- 如果片段着色器生成的像素满足特定条件(最早可以在顶点着色器中确定),则应将其颜色值添加到帧缓冲区中 。
- 如果像素不满足条件,则颜色应完全替换帧缓冲中的颜色。
这可以通过通常的混合功能、阿尔法技巧等来完成吗?
我认为你可以使用标准的预乘alpha混合:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
如果要替换,则从片段着色器输出 alpha 值 1。如果要执行加法,则从片段着色器输出 alpha 值 0。
这假设您只对帧缓冲区中的 RGB 值真正感兴趣。
如果你在顶点着色时知道这一点,我假设整个三角形要么是一种混合,要么是另一种混合。这是模板测试的理想之选,前提是您没有太多的几何形状。
- 将模具清除为零。
- 在禁用颜色写入的情况下绘制形状,对于与两个混合规则之一匹配的区域,将模具设置为 1。
- 设置混合规则一。
- 在启用模板测试的情况下绘制形状,并在模板 == 0 时通过。
- 设置混合规则二。
- 在启用模板测试的情况下绘制形状,并在模板 == 1 时通过。
这需要多少成本取决于您的几何体,因为您需要多次将其传递给渲染,但其中的模板测试部分通常接近"免费"。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 基于多个条件处理地图中的所有元素
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 将按位if条件转换为普通if条件
- 条件断点在不应该触发时触发
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 我提出什么条件才能再加5%的折扣
- 与OpenGL ES的条件混合
- 具有混合数据类型的条件运算符
- 在混合运行时/编译时条件下调度标记