gpt4 book ai didi

delphi - 如何禁用 GPU Canvas FMX TImage 上的插值或将插值设置为 "nearest neighbor"

转载 作者:行者123 更新时间:2023-12-01 22:08:29 24 4
gpt4 key购买 nike

我正在尝试创建捏合缩放 TImage 函数,并希望在调整 firemonkey TImage 控件大小时禁用插值(并且它需要跨多个设备工作)。

如果“GlobalUseGPUCanvas”设置为“True”,则将 TImage 的“DisableInterpolation”设置为“True”在 Windows 上不起作用,或者在 Android 上(我相信 Android 始终使用 GPU Canvas )不起作用。

通过在项目的 DPR 文件中将“GlobalUseGPUCanvas”设置为“True”并在表单的 TImage 上选中“DisableInterpolation”,可以使用 Embarcadero 的图像缩放示例轻松重现这一点:
http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FMX.ImageZoom_Sample

有没有办法真正禁用 GPU Canvas 插值或以某种方式将 GPU 重采样器设置为使用最近邻而不是默认算法(双三次?双线性?)?

最佳答案

您可以使用纹理直接在 Canvas 上绘制图像,而不是使用 TImage

当您创建纹理时,您可以使用 GL_NEAREST 而不是 GL_LINEAR 来指定它(即:Texture.MagFilter)

下面将创建纹理的delphi函数(供引用):

class procedure TCustomContextOpenGL.DoInitializeTexture(const Texture: TTexture);
var
Tex: GLuint;
begin
if Valid then
begin
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, @Tex);
glBindTexture(GL_TEXTURE_2D, Tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
case Texture.MagFilter of
TTextureFilter.Nearest: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
TTextureFilter.Linear: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
end;
if TTextureStyle.MipMaps in Texture.Style then
begin
case Texture.MinFilter of
TTextureFilter.Nearest: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
TTextureFilter.Linear: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
end;
end
else
begin
case Texture.MinFilter of
TTextureFilter.Nearest: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
TTextureFilter.Linear: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
end;
end;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Texture.Width, Texture.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
glBindTexture(GL_TEXTURE_2D, 0);
ITextureAccess(Texture).Handle := Tex;
if (GLHasAnyErrors()) then
RaiseContextExceptionFmt(@SCannotCreateTexture, [ClassName]);
end;
end;

关于delphi - 如何禁用 GPU Canvas FMX TImage 上的插值或将插值设置为 "nearest neighbor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302477/

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