如何将效果(即:TGaussianBlurEffect)应用于单个纹理?

时间:2018-02-04 09:00:55

标签: delphi firemonkey

我在画布上绘制了几个纹理,其中一个我想应用TGaussianBlurEffect。问题是TGaussianBlurEffect将应用于所有容器,因为它被放置(所以所有画布)我想要将它仅应用于一个纹理。

我在delphi中找到了这个函数

procedure TFilterEffect.ProcessTexture(const Visual: TTexture; const Context: TContext3D);
var
  Ver: TVertexBuffer;
  Ind: TIndexBuffer;
  Mat: TTextureMaterial;
begin
  if Assigned(FFilter) then
  begin
    FFilter.ValuesAsTexture['Input'] := Visual;
    FFilter.ApplyWithoutCopytoOutput;
    if Assigned(Context) then
      if Context.BeginScene then
      try
        Ver := TVertexBuffer.Create([TVertexFormat.Vertex, TVertexFormat.TexCoord0], 4);
        Ver.Vertices[0] := Point3D(Context.PixelToPixelPolygonOffset.X,
          Context.PixelToPixelPolygonOffset.Y, 0);
        Ver.TexCoord0[0] := PointF(0.0, 0.0);
        Ver.Vertices[1] := Point3D(Context.PixelToPixelPolygonOffset.X + Visual.Width,
          Context.PixelToPixelPolygonOffset.Y, 0);
        Ver.TexCoord0[1] := PointF(Visual.Width / TFilterManager.FilterTexture.Width, 0.0);
        Ver.Vertices[2] := Point3D(Context.PixelToPixelPolygonOffset.X + Visual.Width,
          Context.PixelToPixelPolygonOffset.Y + Visual.Height, 0);
        Ver.TexCoord0[2] := PointF(Visual.Width / TFilterManager.FilterTexture.Width,
          Visual.Height / TFilterManager.FilterTexture.Height);
        Ver.Vertices[3] := Point3D(Context.PixelToPixelPolygonOffset.X,
          Context.PixelToPixelPolygonOffset.Y + Visual.Height, 0);
        Ver.TexCoord0[3] := PointF(0.0, Visual.Height / TFilterManager.FilterTexture.Height);
        Ind := TIndexBuffer.Create(6);
        Ind[0] := 0;
        Ind[1] := 1;
        Ind[2] := 3;
        Ind[3] := 3;
        Ind[4] := 1;
        Ind[5] := 2;
        Mat := TTextureMaterial.Create;
        Mat.Texture := TFilterManager.FilterTexture;
        Context.Clear(0);
        Context.SetContextState(TContextState.cs2DScene);
        Context.SetContextState(TContextState.csZWriteOff);
        Context.SetContextState(TContextState.csZTestOff);
        Context.SetMatrix(TMatrix3D.Identity);
        Context.DrawTriangles(Ver, Ind, Mat, 1);
        Mat.Free;
        Ind.Free;
        Ver.Free;
      finally
        Context.EndScene;
      end;
  end;
end;

但我不了解它的目的以及如何使用它:(

0 个答案:

没有答案