Я пытаюсь создать приложение фильтра изображений, используя FragmentShader с Flutter.
Я использовал код OpenGL для применения фильтра таблицы поиска, а также создал и применил свой собственный код шейдера в фильтре. Файл .frag.
Эта таблица поиска работает нормально при сборке с помощью MacOS, но при сборке с помощью эмулятора IOS шейдер ломается и выглядит странно.
С кодом вроде все в порядке, но кто-нибудь знает, почему такая разница?
Я попробовал использовать библиотеку flutter_image_filters, чтобы проверить это, но результаты те же. Я прикрепил свой код filter.frag,painter.dart.
import "dart:ui" as ui;
import "package:film_n/controllers/main_controller.dart";
import "package:flutter/cupertino.dart";
import "package:flutter/material.dart";
import "package:flutter/widgets.dart";
import "package:get/get.dart";
// make an image shader painter
class ImageShaderPainter extends CustomPainter {
final ui.Image? image;
final ui.Image? lut;
final ui.FragmentShader? shader;
final controller = Get.find();
ImageShaderPainter({
this.image,
this.lut,
this.shader,
});
@override
void paint(Canvas canvas, Size size) {
if (image == null || shader == null || lut == null) {
return;
}
late double scaledWidth;
late double scaledHeight;
// Get the original width and height of the image
final double imageWidth = image!.width.toDouble();
final double imageHeight = image!.height.toDouble();
// Get the width and height of the canvas or the available space
final double canvasWidth = size.width;
final double canvasHeight = size.height;
// Calculate the aspect ratios of the image and the canvas
final double imageAspectRatio = imageWidth / imageHeight;
final double canvasAspectRatio = canvasWidth / canvasHeight;
if (imageAspectRatio canvasAspectRatio) {
// Image is wider than the canvas
scaledWidth = canvasWidth;
scaledHeight = scaledWidth / imageAspectRatio;
} else {
// Image is taller than the canvas or has the same aspect ratio
scaledHeight = canvasHeight;
scaledWidth = scaledHeight * imageAspectRatio;
}
// set the image position arguments
shader!.setFloat(0, size.width);
shader!.setFloat(1, size.height);
shader!.setFloat(2, scaledWidth);
shader!.setFloat(3, scaledHeight);
shader!.setImageSampler(0, image!);
shader!.setImageSampler(1, lut!);
final paint = Paint()..shader = shader;
canvas.drawRect(
Rect.fromCenter(
center: Offset(canvasWidth / 2, canvasHeight / 2),
width: scaledWidth,
height: scaledHeight),
paint);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
if (oldDelegate is ImageShaderPainter &&
oldDelegate.shader == shader &&
oldDelegate.lut == lut &&) {
return false;
}
return true;
}
}
Я попробовал изменить точность на highp, но это не помогло.
Я пытаюсь создать приложение фильтра изображений, используя FragmentShader с Flutter. Я использовал код OpenGL для применения фильтра таблицы поиска, а также создал и применил свой собственный код шейдера в фильтре. Файл .frag. Эта таблица поиска работает нормально при сборке с помощью MacOS, но при сборке с помощью эмулятора IOS шейдер ломается и выглядит странно. С кодом вроде все в порядке, но кто-нибудь знает, почему такая разница? Я попробовал использовать библиотеку flutter_image_filters, чтобы проверить это, но результаты те же. Я прикрепил свой код filter.frag,painter.dart. [list] [*]filter.frag [code]vec4 lookupFrom2DTexture(vec3 textureColor) { float blueColor = textureColor.b * 63.0;
// make an image shader painter class ImageShaderPainter extends CustomPainter { final ui.Image? image; final ui.Image? lut; final ui.FragmentShader? shader;
late double scaledWidth; late double scaledHeight;
// Get the original width and height of the image final double imageWidth = image!.width.toDouble(); final double imageHeight = image!.height.toDouble();
// Get the width and height of the canvas or the available space final double canvasWidth = size.width; final double canvasHeight = size.height;
// Calculate the aspect ratios of the image and the canvas final double imageAspectRatio = imageWidth / imageHeight; final double canvasAspectRatio = canvasWidth / canvasHeight;
if (imageAspectRatio canvasAspectRatio) { // Image is wider than the canvas scaledWidth = canvasWidth; scaledHeight = scaledWidth / imageAspectRatio; } else { // Image is taller than the canvas or has the same aspect ratio scaledHeight = canvasHeight; scaledWidth = scaledHeight * imageAspectRatio; }
// set the image position arguments shader!.setFloat(0, size.width); shader!.setFloat(1, size.height); shader!.setFloat(2, scaledWidth); shader!.setFloat(3, scaledHeight);