我正在尝试创建一个缩放到缩放的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?)?
答案 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;