gpt4 book ai didi

delphi - Firemonkey半透明Image3D有时不透明

转载 作者:行者123 更新时间:2023-12-03 14:54:09 26 4
gpt4 key购买 nike

我创建了一个带有 3 个半透明 tImage3D 的 FireMonkey 应用程序。这是代码和屏幕。一切似乎都很好。

procedure TForm1.Form3DCreate(Sender: TObject);

// create a new semi-transparent timage3d
// object with color and Z position.
procedure NewImage ( const nColor : tColor;
const nZ : integer );
begin
// create the image
with tImage3D . Create ( self ) do
begin
// put it on the screen
Parent := self;
// set the size
Width := 10;
Height := 10;
// set the image to a single pixel.
Bitmap . Width := 1;
Bitmap . Height := 1;
// set the Alpha to $80 to make it
// semi-transparent
Bitmap . Pixels [ 0, 0 ] := $80000000 + nColor;
// set the z position
Position . Z := nZ;
end;
end;

begin
NewImage ( claRed, +10 );
NewImage ( claGreen, 0 );
NewImage ( claBlue, -10 );
end;

All is well

现在颠倒顺序。现在它们是不透明的。

begin
NewImage ( claRed, -10 );
NewImage ( claGreen, 0 );
NewImage ( claBlue, +10 );
end;

Now they are opaque

我错过了什么?

最佳答案

FireMonkey(截至目前)不支持渲染 3D 半透明对象。

FireMonkey 仅支持半透明对象的混合(通过不透明度属性或由于其纹理,例如半透明 PNG 图像),但 blending仅靠 Z-Buffer 不足以在 3D 中正确显示它。 (这是 FMX 和大多数 3D 应用程序正在使用的)。

有关技术说明,您可以阅读 Transparency sorting ,本文是关于 OpenGL 的,但也适用于 DirectX。

因此,为了获得正确的渲染效果,您需要从相机的角度将半透明对象从后到前排序

您可以在本文中获取更多详细信息和一些代码来解决该问题:

Rendering semi-transparent object in FireMonkey

但请记住,这只是一种解决方法

理想情况下,这应该由 FireMonkey 场景图处理,因为它依赖于渲染,否则,您最终必须更改场景图结构,这可能会产生各种其他副作用,甚至会出现更多问题如果您有多个摄像机观看同一场景。

此外,排序方法仅适用于不相交且没有三重重叠的凸对象,如下所示:

Triple Overlap example

不存在正确的排序(没有一个元素在其他元素的前面)。

关于delphi - Firemonkey半透明Image3D有时不透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8497973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com