В приведенном ниже фрагменте кода я рисую текстуру на холсте слева, затем вызываю метод Canvas.toBlob() и отображаю результат в
После некоторой отладки я обнаружил, что проблема в том, что WebGL по умолчанию устанавливает premultipliedAlpha: true, что означает, что он ожидает что значения RGB каждого пикселя в текстурах уже умножены на значение альфа, и поэтому они должны быть меньше или равны значению альфа. Однако на практике это часто не совсем так, возможно, из-за сжатия текстур. (Мое изображение в качестве примера вырезано из реальной текстуры, где я впервые заметил эту проблему.) Когда некоторые значения RGB превышают значение альфа, пиксели по-прежнему хорошо отображаются на холсте, но при преобразовании в изображение они будут выглядеть совершенно по-другому. Приведенный ниже фрагмент кода дополнительно демонстрирует эту проблему с чистым цветным фоном со значениями RGBA (1,0, 0,99, 0,99, 0,99).
Я мог бы обойти эту проблему, установив для premultipliedAlpha значение false:
var ctx3d = cvs3d.getContext('experimental-webgl', {premultipliedAlpha: false});
Однако это влияет на внешний вид всех пикселей со значением альфа строго от 0 до 1, а не только тех нескольких пикселей с недопустимыми значениями RGBA для premultipliedAlpha, поэтому в зависимости от сценария это может быть неудовлетворительным решением. Есть ли другой способ решить эту проблему?
Примечание. В приведенном ниже фрагменте кода код рендеринга изображения адаптирован из https://stackoverflow.com/a/12396488.
В приведенном ниже фрагменте кода я рисую текстуру на холсте слева, затем вызываю метод Canvas.toBlob() и отображаю результат в [img]https://i.sstatic.net/iX0aLmj8.png[/img]
После некоторой отладки я обнаружил, что проблема в том, что WebGL по умолчанию устанавливает premultipliedAlpha: true, что означает, что он ожидает что значения RGB каждого пикселя в текстурах уже умножены на значение альфа, и поэтому они должны быть меньше или равны значению альфа. Однако на практике это часто не совсем так, возможно, из-за сжатия текстур. (Мое изображение в качестве примера вырезано из реальной текстуры, где я впервые заметил эту проблему.) Когда некоторые значения RGB превышают значение альфа, пиксели по-прежнему хорошо отображаются на холсте, но при преобразовании в изображение они будут выглядеть совершенно по-другому. Приведенный ниже фрагмент кода дополнительно демонстрирует эту проблему с чистым цветным фоном со значениями RGBA (1,0, 0,99, 0,99, 0,99). Я мог бы обойти эту проблему, установив для premultipliedAlpha значение false: [code]var ctx3d = cvs3d.getContext('experimental-webgl', {premultipliedAlpha: false}); [/code] Однако это влияет на внешний вид всех пикселей со значением альфа строго от 0 до 1, а не только тех нескольких пикселей с недопустимыми значениями RGBA для premultipliedAlpha, поэтому в зависимости от сценария это может быть неудовлетворительным решением. Есть ли другой способ решить эту проблему? Примечание. В приведенном ниже фрагменте кода код рендеринга изображения адаптирован из https://stackoverflow.com/a/12396488.