Я пытаюсь создать приложение фильтра изображений, используя 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);
Я хочу сделать шейдер для игры в пиксель, которая бы нарисовала спрайт с контуром, если его цвет фона совпадает с указанным цветом. Эта версия работает нормально (1-е фото):
#version 400 core
in vec2 TexCoords;
out vec4 color;
Многие кросс -платформные решения выступили для iOS/Android/планшета и т. Д., Почему бы просто не использовать веб -сайт? Интернет является лучшим решением для кросс -платформы, и использование JavaScript в HTML5 может достичь множества функций....
Многие кросс -платформные решения выступили для iOS/Android/планшета и т. Д., Почему бы просто не использовать веб -сайт? Интернет является лучшим решением для кросс -платформы, и использование JavaScript в HTML5 может достичь множества функций....
Далее приведен отрывок из блога. Это стол. Если интересно, вы можете просмотреть полную страницу по адресу
Как мне сделать эта таблица отображается в виде одного столбца на узком экране?
Спасибо
Photon counting and tagging, precision 55ps, adj...
Далее приведен отрывок из блога. Это стол. Если интересно, вы можете просмотреть полную страницу по адресу
Как мне сделать эта таблица отображается в виде одного столбца на узком экране?
/>
Photon counting and tagging, precision 55ps, adj...