几年前,当Vista首次发布时,我问了一个关于这个问题的问题,但从未解决过这个问题,并将其作为后来考虑的问题搁置了.
我有一个闪屏,我努力让自己看起来很棒.它是一个32bpp的alpha混合PNG.我有一些代码(如果需要我可以挖掘!)在Windows XP或Vista +下关闭桌面组合时效果很好.然而,在Vista +下,所有透明部分都是黑色的,破坏了一切看起来很棒的东西!
所以,我的问题是这样的:因为任何人都可以将一个32bpp的alpha混合PNG作为启动画面显示,无论是否激活桌面合成都可以使用?如果需要,我可以免费或以其他方式使用第三方组件.
理想情况下,这适用于Delphi 7.
更新:除了下面的答案,这些工作非常好,我发现TMS TAdvSmoothSplashScreen组件也能很好地处理这个任务,如果有点复杂的话.
这可能非常简单,但我甚至不确定它叫什么 - 这使得谷歌搜索比平常有用.
我有一个带有alpha的灰度线条图,用于消除锯齿效果.该图用作游戏中的玩家令牌.目前,我已经创建了几个彩色变体(在Photoshop中).但我希望能够以编程方式为原始图像着色,同时保留alpha值.我正在使用Quartz/Core Graphics,我怀疑可能会有某种混合方式可以达到预期的效果 - 但不确定哪种方式,甚至不确定方法是否合适.
我对 openGL 中的 alpha 混合有疑问...
我已经尝试了一些绘制透明对象的东西......通过在绘制透明面之前禁用 GL_DEPTH_TEST 并在绘制透明面后再次重新启用 GL_DEPTH_TEST ,我看到了一个不错的(理想的)结果......
显然我已经注意到,根据我绘制不同面孔的顺序,我得到了一个结果或另一个......
但是我决定首先在启用 GL_DEPTH_TEST 的情况下绘制实体面,然后在禁用 GL_DEPTH_TEST 的透明面之后...
所以,很明显,如果我在禁用 GL_DEPTH_TEST 的情况下绘制透明面,我会看到内部的透明面(例如立方体),然后
所以,我的问题是......这是正确的吗?OpenGL 是否有一种“神奇”的方式来自动排序不透明和透明的面?
我有两个numpy形状的阵列(256,256,4).我想将第四个256 x 256平面视为alpha级别,并导出一个覆盖这些数组的图像.
代码示例:
import numpy as np
from skimage import io
fg = np.ndarray((256, 256, 4), dtype=np.uint8)
one_plane = np.random.standard_normal((256, 256)) * 100 + 128
fg[:,:,0:3] = np.tile(one_plane, 3).reshape((256, 256, 3), order='F')
fg[:, :, 3] = np.zeros((256, 256), dtype=np.uint8)
fg[0:128, 0:128, 3] = np.ones((128, 128), dtype=np.uint8) * 255
fg[128:256, 128:256, 3] = np.ones((128, 128), dtype=np.uint8) * 128
bg = np.ndarray((256, 256, 4), dtype=np.uint8)
bg[:,:,0:3] = np.random.standard_normal((256, 256, 3)) * 100 + 128
bg[:, :, 3] = np.ones((256, 256), dtype=np.uint8) …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建链连接表面。我有 2 个纹理;具有金属链接的金属外观和白色背景(漫反射)的标准贴图:

我还有一张 alpha 贴图:

我试图将这两个应用到一个MeshBasicMaterial没有运气的情况:
var chainlinkMask = THREE.ImageUtils.loadTexture('textures/chainlink_Large-Panels_mask.png');
chainlinkMask.wrapS = THREE.RepeatWrapping;
chainlinkMask.wrapT = THREE.RepeatWrapping;
chainlinkMask.repeat.set( 2, 2 );
var chainlinkDiffuse = THREE.ImageUtils.loadTexture('textures/chainlink_Large-Panels_Diffuse.png');
chainlinkDiffuse.wrapS = THREE.RepeatWrapping;
chainlinkDiffuse.wrapT = THREE.RepeatWrapping;
chainlinkDiffuse.repeat.set( 2, 2 );
material.map = chainlinkMask;
material.alphaMap = chainlinkDiffuse;
material.transparency = true;
material.side = THREE.DoubleSide;
Run Code Online (Sandbox Code Playgroud)
这给了我以下内容:

正如您所看到的,Alpha 贴图没有被应用。
为什么不?
任何帮助表示赞赏。
我正在使用这些函数调用:
glEnable(GL_BLEND)
glEnable(GL_POLYGON_SMOOTH)
glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE)
Run Code Online (Sandbox Code Playgroud)
它不起作用,也不会渲染.
glEnable(GL_BLEND)
glEnable(GL_POLYGON_SMOOTH)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Run Code Online (Sandbox Code Playgroud)
它没有反别名.
这个问题来自较早的问题.大多数代码来自可能在后续版本的Delphi中使用的建议答案.在D2006中,我没有获得全范围的不透明度,图像的透明部分显示为白色.
图片来自http://upload.wikimedia.org/wikipedia/commons/6/61/Icon_attention_s.png.
它在运行时从PNGImageCollection加载到TImage中,因为我发现你必须这样做,因为在保存DFM后图像不会保持不变.出于演示行为的目的,您可能不需要PNGImageCollection,并且可以在设计时将PNG图像加载到TImage中,然后从IDE运行它.
表单上有四个按钮 - 每个按钮设置不同的不透明度值.Opacity = 0工作正常(paintbox图像不可见,opacity = 16看起来没问题,除了白色背景,不透明度= 64,255相似 - 不透明度似乎在10%左右饱和.
关于什么事情的任何想法?
unit Unit18;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, pngimage, StdCtrls, Spin, PngImageList;
type
TAlphaBlendForm = class(TForm)
PaintBox1: TPaintBox;
Image1: TImage;
PngImageCollection1: TPngImageCollection;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure PaintBox1Paint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
FOpacity : Integer ;
FBitmap : TBitmap ;
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用WebGL显示一个简单的效果.当然,这意味着我正在使用GLSL ES 1.0规范中定义的片段着色器语言.
我正在使用的代码主要是从其他来源复制的.它设置一个正方形并使用片段和顶点着色器来确定像素颜色.以下代码将只显示一个白色方块.
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
Run Code Online (Sandbox Code Playgroud)
但是,如果我将alpha分量更改为1.0然后它将显示黑色方块.
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); // displays a black square
Run Code Online (Sandbox Code Playgroud)
我假设片段着色器输出的颜色必须与之前的颜色组合.如何确保只有最后一种颜色(不论其alpha值)是否实际被选为要显示的颜色?
或者也许我的订单错了.也许后期阶段与片段着色器中的颜色组合以产生白色.在任何情况下,我都知道正在进行某种混合,因为当我将alpha值更改为0.5时,我得到一个灰色方块.我只是想知道,白色来自哪里?我怎么摆脱它呢?
据我所知,问题与混合功能无关.该代码是在GitHub 这里.在Google Chrome或Firefox中试用.
我正在看SurfaceFlinger,即在Android中进行组合的代码,我无法理解一些OpenGL ES 1.0调用,因为我只编写了ES 2.0代码.
以下是我感兴趣的代码:
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
应该做的是将纹理混合到缓冲区中.
为什么需要glTextEnvx和glColor4x电话?glBlendFunc实现混合还不够?
我知道我的问题是天真的,但我仍然不明白glTexEnvx在阅读文档之后是什么.
在iphone上的Opengl es2.一些对象由多层精灵与alphas组成.
然后我也有UI元素,它们也是由各种精灵组合在一起的,我淡入/淡出其他一切.我通过调整着色器中的alpha来淡化.
我的纹理是PNG与alphahop中制作的alpha.我没有故意为他们做好准备.我希望它们是直的alpha,但在我的应用程序中,它们表现得好像它们被预先乘以我可以看到在白色背景上绘制的白色精灵周围的黑色边缘.
如果我将混合模式设置为:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
这些元素很好地融合在一起,没有奇怪的边缘.但是当元素逐渐消失时,它们最终会成为POP.它们将开始消退但不会一直下降到alpha零.所以在淡出动画结束时,当我删除元素时,它们"弹出"会导致它们没有完全消失.
如果我将混合模式切换为:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)
元素很好地淡化和淡化.但是白色元素上的任何白色都有一个看起来像alpha预乘的暗边缘.查看白框顶部绘制的白色圆圈:

但是场景中的其他混合物对我来说很好看.其他透明物体很好地融合在一起.
另一个重要的注意事项是我的着色器处理元素和颜色元素的不透明度.对于绘制的每个东西,我乘以元素颜色,最后的alpha乘以不透明度值:
void main(void)
{
gl_FragColor = texture2D(u_textureSampler,v_fragmentTexCoord0);
gl_FragColor = vec4(gl_FragColor.r*u_baseColor.r,gl_FragColor.g*u_baseColor.g,gl_FragColor.b*u_baseColor.b,gl_FragColor.a*u_baseColor.a * u_opacity);
}
Run Code Online (Sandbox Code Playgroud)
这允许我在我的精灵表中拍摄一个白色物体,并使其成为我想要的任何颜色.或者使用灰色的baseColor使对象变暗.
每当我想到我理解这些混合模式时,我就会开始怀疑自己.
是否有其他混合模式组合在我的精灵上有光滑的边缘,并且还支持着色器中的alpha淡化/混合?
我假设需要GL_SRC_ALPHA在着色器中使用alpha进行混合.
或者我的问题是我需要使用除PSD以外的东西来保存我的精灵表吗?因此在这一点上几乎是不可能的.
更新:
我认为答案可能只是否定,没有办法做我想要的.第二种混合模式应该是正确的.但它有可能是将RGB与某个地方的alpha相乘,或者它在源文件中被预乘.我甚至尝试通过添加以下内容在上面的着色器中预先复制alpha:
gl_FragColor.rgb *= glFragColor.a;
Run Code Online (Sandbox Code Playgroud)
但这只会使衰落看起来很糟糕,因为当它们逐渐淡出时,它们会变成灰色.如果我自己预先设定alpha并使用上面的其他混合模式,那么事情看起来和我原来的一样.它们在没有弹出的情况下逐渐消失,但你仍然可以看到光环.
alphablending ×10
delphi ×2
ios ×2
opengl ×2
opengl-es ×2
png ×2
alpha ×1
android ×1
antialiasing ×1
colors ×1
compositing ×1
delphi-2006 ×1
glsl ×1
image ×1
iphone ×1
javascript ×1
numpy ×1
polygon ×1
primitive ×1
python ×1
scikit-image ×1
textures ×1
three.js ×1
timage ×1
webgl ×1