Delphi 如何在GPU画布上禁用插值FMX TImage或将插值设置为";“最近邻居”;
我正在尝试创建一个“收缩到缩放”TImage函数,并希望在调整firemonkey TImage控件的大小时禁用插值(它需要跨多个设备工作) 如果“GlobalUseGPUCanvas”设置为“True”,那么将TImage的“DisableInterpolation”设置为“True”在Windows上不起作用,或者在Android上(我相信它总是使用GPU画布) 通过在项目的DPR文件中将“GlobalUseGPUCanvas”设置为“True”,并在表单的TImage上选中“DisableInterpolation”,Embarcadero的图像缩放样本可以轻松地再现此结果:Delphi 如何在GPU画布上禁用插值FMX TImage或将插值设置为";“最近邻居”;,delphi,image-processing,firemonkey,Delphi,Image Processing,Firemonkey,我正在尝试创建一个“收缩到缩放”TImage函数,并希望在调整firemonkey TImage控件的大小时禁用插值(它需要跨多个设备工作) 如果“GlobalUseGPUCanvas”设置为“True”,那么将TImage的“DisableInterpolation”设置为“True”在Windows上不起作用,或者在Android上(我相信它总是使用GPU画布) 通过在项目的DPR文件中将“GlobalUseGPUCanvas”设置为“True”,并在表单的TImage上选中“Disable
有没有办法真正禁用GPU画布的插值功能,或者以某种方式将GPU重采样器设置为使用最近邻算法而不是默认算法(双三次?双线性?)您可以使用纹理直接在画布上绘制图像,而不是使用时间图像 创建纹理时,可以使用GL_NEAREST而不是GL_LINEAR(即:texture.MagFilter)指定纹理 下面是将创建纹理的delphi函数(供参考):
这难道不需要在OpenGL中重写整个UI吗?我希望有一个firemonkey GPU画布解决方案。不只是用任何Tcontrol替换timage并使用Ttexture在其上绘制…我以前没有使用Ttexture的经验,我读过关于它的文章,还有很多未知的东西。您能否给出一个示例,说明如何基于TTexture而不是示例的TImage复制Embarcadero的图像缩放示例?对于示例,您可以在的代码源中搜索TTexture。使用纹理和TTbitmap没有什么不同,要打印它,您只需执行以下操作:TCustomCanvasGpu(Canvas).DrawTexture(…);我下载了存储库的zip文件,只在“alcinoe master\archive\source\ALFmxImgList.pas”下找到了对TTexture的引用。而且似乎TTexture代码只在Android和iOS下运行,没有windows支持吗?它似乎还使用了不属于所包含代码的函数。我还从其他TBitmaps(基本上是一个基于分片的游戏)每秒生成大约100次TImage的TBitmap,添加另一个TTexture转换步骤是否会增加大量CPU开销?
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;