由于混合会影响我们游戏的性能,因此我们尝试了几种混合策略来创建混合的“幻觉”。其中之一是每隔奇数帧绘制一个精灵,导致精灵有一半的时间可见。效果还是不错的。(顺便说一句,你需要一个合适的帧速率,否则你的精灵会明显闪烁)
尽管如此,我想知道是否有任何好的见解可以避免混合,以便在不影响(太多)视觉体验的情况下提高整体性能。
我有一个颜色十六进制字符串存储在数据库中,例如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 值来转换它?
我正在尝试使用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) 我正在尝试渲染部分不透明颜色和其他部分透明的纹理。
这是我的对象绘制函数:
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。
例如,我知道超过白色时颜色为#a0c5e8 (160,197,232),超过黑色时颜色为#496e91 (73,110,145)。
有没有办法计算“真实”颜色(100% 不透明度)?
alphablending colors linear-algebra opacity alpha-transparency
我的应用程序中有一个阶段需要与设备“同步”。在这段时间里,我想 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胜过在子视图中的放置。是否仅在给定的容器内?我认为它对屏幕上的所有视图(及其相关层)都是全局的。
我正在尝试创建一个工具来帮助我为网络应用程序选择颜色。基本上,我希望能够指定最终颜色和一些叠加参数,并确定底层颜色需要是什么(或者是否可以使用指定参数实现)。
所有覆盖层都将是半透明的黑色。
该系统如何工作的示例:
我应该指出,我不需要帮助来编写实际代码,我只是不知道要使用的数学公式,而且我今天的 Google 能力很弱。我能找到的最接近的是这个优秀的答案(/sf/answers/856005041/),但它缺少“了解最终所需颜色、了解叠加颜色、了解叠加不透明度”的迭代
我想使用 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) 这是提高精度的像素混合操作的一部分。
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如何产生所需的结果。它背后的数学原理是什么?
我想在OpenGL中渲染两个场景,然后从一个场景到第二个场景进行视觉交叉淡入淡出.任何人都可以建议学习如何做到这一点的起点?