Firemonkey使用Alpha

时间:2015-11-18 04:41:58

标签: delphi shader firemonkey hlsl alphablending

使用Delphi / Firemonkey XE8。最近有一些不错的运气,虽然你必须破解它才能让它做你想要的。我目前的项目是评估它的低级3D功能,看看我是否可以将它们作为游戏项目的起点。我也非常了解Unity3D,我正在考虑使用Unity3D,但我认为Delphi / Firemonkey可能会给我一些额外的灵活性,因为它的游戏设计很少。

所以我决定深入研究Embarcadero提供的样本......特别是LowLevel3D样本。这是一个跨平台的示例,它向您展示除了在屏幕上使用您选择的一些自定义着色器绘制旋转方块之外什么都不做,并且在所有平台上看起来都一样(尽管它实际上并不适用于AT在所有平台上都一样......但我们不会进入那个。)

Embc不提供项目的原始未编译着色器(我可能会添加它真的很蹩脚),并要求您为您要定位的各种平台提供自己的兼容着色器(有些已编译,有些没有) (也是蹩脚的)......所以我的第一份工作就是创建一个着色器,该着色器可以与现有的样本一起使用,而不是样本已经做过的事情。具体来说,如果我正在创建一个2D游戏,我想确保我可以用alpha透明度,基本的东西做精灵....如果我可以让这个工作,我可能永远不必写整场比赛的另一个着色器。

拔出我的头发好几个小时之后,我想出了一个与演示相同参数的小阴影。

Texture2D mytex0: register(t0);
Texture2D mytex1: register(t1);
float4 cccc : register(v0) ;   

struct PixelShaderInput
{
    float4 Pos: COLOR;
    float2 Tex: TEXCOORDS;

};

SamplerState g_samLinear
{
 Filter = MIN_MAG_MIP_LINEAR;
 AddressU = Wrap;
 AddressV = Wrap;
};

RasterizerState MyCull {
  FrontCounterClockwise = FALSE;
};

float4 main(PixelShaderInput pIn): SV_TARGET
{
  float4 cc,c;
  float4 ci = mytex1.Sample(g_samLinear, pIn.Tex.xy);
  c = ci;
  c.a = 0;//<----- DOES NOT actually SET ALPHA TO ZERO ... THIS IS A PROBLEM
  cc = c;
  return cc;
}

永远不要介意它实际上并没有对参数做多少工作,但请查看我将输出的ALPHA设置为0的行。嗯....我发现这实际上没有效果!

但它比这更令人尴尬。我发现在Delphi App中打开CULLING修复了这个问题。所以我认为......没什么大不了的,我只是手动画出精灵的两边......对吗?不!当我手动绘制双面精灵时.. 问题又回来了

检查此图片:shader is ignoring alpha=0 when double-sided

在上面的图片中,显然alpha是SOMEWHAT服从,因为云不被黑盒子包围,然而,云本身是超饱和的(我发现如果我乘以rgb * a,那么颜色大约是正确的但是,由于显而易见的原因,我不会在现实生活中这样做。

我对编写自定义着色器的概念不熟悉。任何见解都表示赞赏。

0 个答案:

没有答案