如何在GPU画布FMX TImage上禁用插值或将插值设置为"最近邻居"

时间:2018-03-15 14:45:34

标签: delphi image-processing firemonkey

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

设置TImage" DisableInterpolation" to" True"如果" GlobalUseGPUCanvas"并不适用于Windows。设置为" True"或者在Android上(我相信它总是使用GPU画布)。

使用Embarcadero的Image Zoom样本,通过设置" GlobalUseGPUCanvas"可以很容易地重现这一点。 to" True"在项目的DPR文件中并检查" DisableInterpolation"在形式的TImage上:
http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FMX.ImageZoom_Sample

有没有办法真正禁用GPU画布插值或以某种方式设置GPU重采样器使用最近邻居而不是默认算法(bicubic?bilinear?)?

1 个答案:

答案 0 :(得分:1)

您可以使用纹理

直接在画布上绘制图像,而不是使用TImage

当您创建纹理时,可以使用GL_NEAREST而不是GL_LINEAR(IE: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;