Pixi.js: Renderizar de cabeça para baixo usando WebGL no Safari

Criado em 12 jan. 2016  ·  15Comentários  ·  Fonte: pixijs/pixi.js

Olá, aqui está a situação:

const filmObj = _getFilmObj() /* draw obj somewhere else */
const renderer_1 = PIXI.autoDetectRenderer(width, height)
renderer_1.render(filmObj)
const filmTexture = new PIXI.Texture(new PIXI.BaseTexture(renderer_1.view))
renderer_1.destroy()

const artboardObj = new PIXI.Sprite(filmTexture)
const renderer_2 = PIXI.autoDetectRenderer(width, height)
renderer_2.render(artboardObj)
const artboardTexture =new PIXI.Texture(new PIXI.BaseTexture(renderer_2.view))
renderer_2.destroy()

/* render artboardTexture somewhere else */

Ao testar no Safari (iOS / Mac OS X), renderer_2.view é virado de cabeça para baixo contra filmObj , enquanto renderer_1.view é natural. Parece que renderer_2 renderizando coordenadas incorretas em renderer_1.view . Você poderia verificar se alguma coisa está desgastada?

Informações adicionais:

  1. No Chrome (desktop / celular) está tudo bem;
  2. Usando CanvasRenderer está tudo bem também, mesmo no Safari.

Comentários muito úteis

@redsend

Não é garantido que toDataURL e getImageData retornem coisas certas para WebGL, nem mesmo no padrão. Você deve usar a API de extração PIXI:

//if you want canvas
var canvas =renderer.extract.canvas(stage);
//if you want base64
var base64=renderer.extract.base64(stage);

Todos 15 comentários

Testado no Safari / Firefox / Chrome e segue abaixo:
02 01 46

estranhas! vai dar uma olhada ..

Parece que tenho um problema semelhante com a tela sendo virada de cabeça para baixo no Safari, enquanto o Chrome exibe corretamente.

Agora eu defino baseTexture.flipY = true no Safari e uso um truque sujo abaixo para superar isso.

diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js
index 05258f6..82b1c84 100644
--- a/src/core/renderers/webgl/WebGLRenderer.js
+++ b/src/core/renderers/webgl/WebGLRenderer.js
@@ -396,6 +396,9 @@ WebGLRenderer.prototype.updateTexture = function (texture)

     gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]);

+    if (texture.flipY) {
+        gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);
+    }
     gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha);
     gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source);

Eu tenho um problema semelhante onde adiciono Sprites a um Sprites e, em seguida, chamo toDataURL () na tela. A imagem retornada é invertida verticalmente no safari mais recente, enquanto o safari mais antigo (7.1 testado) e outros navegadores parecem retornar uma imagem não invertida. Alguma sugestão de como consertar isso?

@holymonson talvez valha a pena testar em safáris mais antigos para ver se você tem um comportamento semelhante?

Curioso para saber se alguém encontrou a origem deste problema?

para não deixar esse thread morrer: eu não encontrei uma solução para ele e tive que voltar para a renderização forçada da tela.

Isso pode estar relacionado ao contexto WebGL premultipliedAlpha ; no meu caso, só posso reproduzir o problema se premultipliedAlpha for false para o segundo renderizador. Será necessário retirar uma demonstração isolada para verificar.

Odeio a ideia de como isso pôde acontecer, mas primeiro preciso reproduzi-lo.

Aqui está um caso reproduzível; afeta apenas as imagens geradas com toDataURL no Safari.
https://jsbin.com/qivife/14/edit?js , saída

existe uma maneira de exportar com a API toDataURL a imagem não invertida?

@redsend

Não é garantido que toDataURL e getImageData retornem coisas certas para WebGL, nem mesmo no padrão. Você deve usar a API de extração PIXI:

//if you want canvas
var canvas =renderer.extract.canvas(stage);
//if you want base64
var base64=renderer.extract.base64(stage);

var base64 = renderer.extract.base64 (estágio); e var canvas = renderer.extract.canvas (stage); corrigir o problema de cabeça para baixo Mas então o tamanho da tela mudou e as cores de fundo não persistem. Alguma sugestão

Estou usando PIXI.RenderTexture que corrige o problema de tamanho da imagem, mas a cor de fundo ainda não pega

Este tópico foi bloqueado automaticamente, pois não houve nenhuma atividade recente depois que ele foi fechado. Abra um novo problema para bugs relacionados.

Esta página foi útil?
0 / 5 - 0 avaliações