标签: alphablending

处理 OpenGL 中的 alpha 混合以获得更好的性能

由于混合会影响我们游戏的性能,因此我们尝试了几种混合策略来创建混合的“幻觉”。其中之一是每隔奇数帧绘制一个精灵,导致精灵有一半的时间可见。效果还是不错的。(顺便说一句,你需要一个合适的帧速率,否则你的精灵会明显闪烁)

尽管如此,我想知道是否有任何好的见解可以避免混合,以便在不影响(太多)视觉体验的情况下提高整体性能。

opengl graphics performance alphablending

3
推荐指数
1
解决办法
3694
查看次数

通过与白色背景进行 alpha 混合将 ARBG 转换为 RGB

我有一个颜色十六进制字符串存储在数据库中,例如0x78dce6b0;我可以使用以下方法将其转换为 ARGB 颜色:

string colorString=0x78dce6b0;
int hexColor = Convert.ToInt32(colorString ?? "0", 16);
Color colorTL = Color.FromArgb(hexColor);
Run Code Online (Sandbox Code Playgroud)

现在我想将其转换为在 HTML 页面中使用,因此我需要转换为 HTML 值,例如#cc3388. 如果我直接使用 进行转换ColorTranslator.ToHtml(colorTL),我会丢失 alpha 混合值。假设背景始终为白色,如何通过考虑 alpha 值来转换它?

c# rgb alphablending argb

3
推荐指数
1
解决办法
6850
查看次数

使用ShaderEffectItem进行奇怪的alpha混合结果

我正在尝试使用QML项目应用简单的alpha蒙版ShaderEffectItem.

这是一个最小的(非)工作示例:我有一个红色到白色的渐变作为背景,并希望在它上面绘制一个绿色的200x200平方.此方块的alpha蒙版应该在左侧为0.0,在右边框为1.0,因此在左边框应该是透明的.

import QtQuick 1.1
import Qt.labs.shaders 1.0

Rectangle {
    width: 300
    height: 300

    id: wrapper

    gradient: Gradient {
        GradientStop { position: 0.0; color: "red" }
        GradientStop { position: 1.0; color: "white" }
    }

    Rectangle {
        id: square
        anchors.centerIn: parent
        width: 200
        height: 200
        color: "green"
    }

    ShaderEffectItem {
        anchors.centerIn: parent
        width: 200
        height: 200

        property variant source: ShaderEffectSource {
            sourceItem: square
            hideSource: true
        }

        fragmentShader: "
        varying vec2 qt_TexCoord0;
        uniform sampler2D source;
        void main(void)
        {
            vec4 sourceColor …
Run Code Online (Sandbox Code Playgroud)

qt alphablending glsl qml

3
推荐指数
1
解决办法
1287
查看次数

具有透明度 (alpha) 的 OpenGL 纹理

我正在尝试渲染部分不透明颜色和其他部分透明的纹理。

这是我的对象绘制函数:

void drawHighGrass(){
glDisable(GL_LIGHTING);
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor4f(1.0, 1.0, 1.0, 1.0);

glDisable(GL_DEPTH_TEST);

glDepthMask(GL_FALSE);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);



glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texturas[HIGH_GRASS]);

glPushMatrix();
//glTranslatef(1000, 0, 1000);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0, 0, 0);
glTexCoord2f(1.0f, 0.0f); glVertex3f(100, 0, 0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 40, 0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0, 40, 0);
glEnd();

glPopMatrix();

glDisable(GL_TEXTURE_2D);

glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
glEnable(GL_LIGHTING);

}
Run Code Online (Sandbox Code Playgroud)

问题是在透明部分它显示纯白色。我可以使用 glColor4f(1.0, 1.0, 1.0, 0.5) 使纹理透明,但这不是我想要的,因为它使整个纹理透明,而不仅仅是透明部分。

我检查过,我的纹理文件是具有透明度的PNG。

c++ opengl transparency alphablending

3
推荐指数
1
解决办法
2万
查看次数

根据颜色相对于其他颜色的值计算不透明度?

例如,我知道超过白色时颜色为#a0c5e8 (160,197,232),超过黑色时颜色为#496e91 (73,110,145)。

有没有办法计算“真实”颜色(100% 不透明度)?

alphablending colors linear-algebra opacity alpha-transparency

3
推荐指数
1
解决办法
1044
查看次数

iOS CALayer.zPosition 不超越视图层次结构吗?

我的应用程序中有一个阶段需要与设备“同步”。在这段时间里,我想 a) 防止用户触摸东西 b) 显示同步操作的一些进度。

我制作了一个自定义 UIView 来显示我的百分比反馈并将其放置在适当位置的视图树中。这解决了(b)。

对于 (a),我只是在所有内容的顶部添加一个 UIView

myController.view.addSubview(newView)
Run Code Online (Sandbox Code Playgroud)

并操纵它的 alpha 值。通过使用半透明颜色/alpha 值,我可以使应用程序“变灰”。

但是,我希望我的反馈控制仍然显示“全彩”。我我可以简单地调整layer.zPosition所述视图的 ,以使其在遮罩/阻挡/灰色视图的“上方”绘制。

myFeedbackView.layer.zPosition = 100.0
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不起作用。使用 50% 的 alpha 蓝色作为保护视图,反馈视图不像希望的那样是明亮的全彩色。

我曾认为这zPosition胜过在子视图中的放置。是否仅在给定的容器内?我认为它对屏幕上的所有视图(及其相关层)都是全局的。

alphablending z-order calayer uiview ios

3
推荐指数
1
解决办法
1048
查看次数

以编程方式计算应用半透明叠加后实现特定颜色所需的基色

我正在尝试创建一个工具来帮助我为网络应用程序选择颜色。基本上,我希望能够指定最终颜色和一些叠加参数,并确定底层颜色需要是什么(或者是否可以使用指定参数实现)。

所有覆盖层都将是半透明的黑色。

该系统如何工作的示例:

  1. 我输入以下变量:
    • 最终颜色红色:128 [0-255]
    • 最终颜色绿色:118 [0-255]
    • 最终颜色蓝色:107 [0-255]
    • 覆盖不透明度:0.21 [0-1]
  2. 系统返回:
    • RGB(183, 169, 154)

我应该指出,我不需要帮助来编写实际代码,我只是不知道要使用的数学公式,而且我今天的 Google 能力很弱。我能找到的最接近的是这个优秀的答案(/sf/answers/856005041/),但它缺少“了解最终所需颜色、了解叠加颜色、了解叠加不透明度”的迭代

javascript alphablending colors

3
推荐指数
1
解决办法
641
查看次数

使用 OpenCV 对视频进行 Alpha 混合

我想使用 alpha 视频将一个视频混合到另一个视频之上。这是我的代码。它工作得很好,但问题是这段代码根本没有效率,这是因为/255部分原因。它很慢并且有滞后问题。

有没有标准和有效的方法来做到这一点?我希望结果是实时的。谢谢

import cv2
import numpy as np

def main():
    foreground = cv2.VideoCapture('circle.mp4')
    background = cv2.VideoCapture('video.MP4')
    alpha = cv2.VideoCapture('circle_alpha.mp4')

    while foreground.isOpened():
        fr_foreground = foreground.read()[1]/255
        fr_background = background.read()[1]/255     
        fr_alpha = alpha.read()[1]/255

        cv2.imshow('My Image',cmb(fr_foreground,fr_background,fr_alpha))

        if cv2.waitKey(1) == ord('q'): break

    cv2.destroyAllWindows

def cmb(fg,bg,a):
    return fg * a + bg * (1-a)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

python opencv alphablending lag

3
推荐指数
1
解决办法
1683
查看次数

乘以 66049 如何重复位?

这是提高精度的像素混合操作的一部分。

typedef unsigned uint;

uint h(uint x) {
    x &= 0xff;
    return x << 8 | x;
}

uint g(uint x, uint y) {
    return h(x) * h(y) >> 24;
}
Run Code Online (Sandbox Code Playgroud)

我查看了编译器的输出,发现了一行非常有趣的内容。

g:
        movzx   edi, dil
        movzx   esi, sil
        imul    esi, edi
        imul    eax, esi, 66049  # <---
        shr     eax, 24
        ret
Run Code Online (Sandbox Code Playgroud)

这可以反编译为,

uint g_(uint x, uint y) {
    return (x & 0xff) * (y & 0xff) * 66049 >> 24;
}
Run Code Online (Sandbox Code Playgroud)

我无法理解乘以66049如何产生所需的结果。它背后的数学原理是什么?

c x86 assembly bit-manipulation alphablending

3
推荐指数
1
解决办法
121
查看次数

OpenGL中的交叉渐变场景

我想在OpenGL中渲染两个场景,然后从一个场景到第二个场景进行视觉交叉淡入淡出.任何人都可以建议学习如何做到这一点的起点?

c++ opengl graphics rendering alphablending

2
推荐指数
1
解决办法
1192
查看次数