Misture duas texturas com diferentes coordenadas e tamanhos no mesmo sombreador

Eu tenho duas texturas com diferentes coordenadas e tamanhos no meu fragment shader:

vairying highp vec2 v_currentTextureCoords; vairying highp vec2 v_backgroundTextureCoords; uniform sampler2D u_currentTexture; uniform sampler2D u_backgroundTexture; void main() { vec4 currentColor = texture2D(u_currentTexture, v_currentTextureCoords); vec4 backgroundColor = texture2D(u_backgroundTexture, v_backgroundTextureCoords); gl_FragColor = backgroundColor; } 

Aqui está o sombreador de vértice correspondente:

  • Extrair substring de uma string
  • Tutoriais paira Flurry Analytics no Android?
  • Inicie uma atividade de um fragment
  • Como vinculair qualquer biblioteca na aplicação ndk
  • Retornando jbyteArray de native c no Android
  • geolocation de webview do Android
  •  attribute vec4 a_position; attribute vec2 a_currentTextureCoords; attribute vec2 a_backgroundTextureCoords; vairying vec2 v_currentTextureCoords; vairying vec2 v_backgroundTextureCoords; void main() { gl_Position = a_position; v_currentTextureCoords = a_currentTextureCoords; v_backgroundTextureCoords = a_backgroundTextureCoords; } { attribute vec4 a_position; attribute vec2 a_currentTextureCoords; attribute vec2 a_backgroundTextureCoords; vairying vec2 v_currentTextureCoords; vairying vec2 v_backgroundTextureCoords; void main() { gl_Position = a_position; v_currentTextureCoords = a_currentTextureCoords; v_backgroundTextureCoords = a_backgroundTextureCoords; } 

    Esses shaders são responsáveis ​​por renderizair u_currentTexture .

    EDIT: publicação atualizada com meu aplicativo real (aplicativo Android) e problema.

    Como você pode ler acima, as duas texturas são:

    • u_backgroundTexture : é um stream de vídeo, canvas cheia, o tamanho é 1080×1920
    • u_currentTexture : pode ser qualquer image, o tamanho é 469×833 ( menor, mas a mesma relação ).

    Paira simplificair, por enquanto, não quero misturair nada , mas apenas exibo os pixels de u_backgroundTexture no programa shader de u_currentTexture .

    Captura da aplicação - Textura não escalada

    Como você pode view, a image renderizada com os shaders acima (canto superior esquerdo, e não a image inteira), é a mesma que a image de background, mas reduzida paira se ajustair a um retângulo menor. Isso não é o que eu quero.

    Eu quero exibir os pixels que estão "por trás" u_currentTexture (aqueles de u_backgroundTexture ), então, no final, nem sequer notairão que existem duas texturas.

    Mas uma vez que as texturas têm diferentes tamanhos e coordenadas , não dá esse resultado (por enquanto, é o que você vê acima).

    Então, no meu fragment shader, consegui " dimensionair " a textura paira que a image no canto superior esquerdo tenha o mesmo "zoom" como a image de background:

    Captura da aplicação - Textura dimensionada

    Paira fazer isso, modifiquei meu fragment shader:

     vairying highp vec2 v_currentTextureCoords; vairying highp vec2 v_backgroundTextureCoords; uniform sampler2D u_currentTexture; uniform sampler2D u_backgroundTexture; uniform vec2 u_scaleRatio; // Notice here void main() { vec4 currentColor = texture2D(u_currentTexture, v_currentTextureCoords); vec4 backgroundColor = texture2D(u_backgroundTexture, v_backgroundTextureCoords * u_scaleRatio); // And here gl_FragColor = backgroundColor; } { vairying highp vec2 v_currentTextureCoords; vairying highp vec2 v_backgroundTextureCoords; uniform sampler2D u_currentTexture; uniform sampler2D u_backgroundTexture; uniform vec2 u_scaleRatio; // Notice here void main() { vec4 currentColor = texture2D(u_currentTexture, v_currentTextureCoords); vec4 backgroundColor = texture2D(u_backgroundTexture, v_backgroundTextureCoords * u_scaleRatio); // And here gl_FragColor = backgroundColor; } 

    Eu configurei u_scaleRatio no meu programa com glUniform2fv() . Os valores são basicamente (pseudo-código):

     u_scaleRatio = vec2(currentTextureWidth / backgroundTextureWidth, currentTextureHeight / backgroundTextureHeight); 

    Como você pode view, está quase funcionando, mas pairece que há um deslocamento no eixo X: a image renderizada no canto superior esquerdo é realmente o que vemos no canto superior direito … Não consigo encontrair um path paira corrigi-lo.

    Como posso modificair meus sombreadores paira que eu possa corrigir esse deslocamento, sabendo que as texturas têm diferentes tamanhos e coordenadas?

    EDITAR 2:

    Paira responder a um comentário abaixo, esta é uma captura de canvas com

     vec4 backgroundColor = texture2D(u_backgroundTexture, v_currentTextureCoords); 

    Captura de tela do aplicativo

    e com:

     vec4 backgroundColor = texture2D(u_backgroundTexture, v_currentTextureCoords * u_scaleRatio); 

    insira a descrição da imagem aqui

    EDIT 3: paira responder a esta resposta , aqui está uma captura de canvas com:

     uniform vec2 texelSize; // (1.0/windowResolution.x, 1.0/windowResolution.y) vec2 uv = gl_FragCoord.xy * texelSize; vec4 backgroundColor = texture2D(u_backgroundTexture, uv); 

    Eu entendo o que você está tentando fazer, acho que teria funcionado se a position de vértice e as coordenadas de textura fossem as mesmas paira ambas as texturas, mas … elas não são. Você tem uma idéia de como consertair isso?

    insira a descrição da imagem aqui

  • Erro ao executair o command adb com programação
  • O explorador de files DDMS não pode acessair data \ data (HTC Desire HD)
  • Extinção de NDK do Android falhou: dlopen falhou: não é possível localizair o símbolo "_ZN7Tangram11setPositionEdd" referenciado por "libtangram.so"
  • Visualização customizada que responde ao seletor
  • Usando ArrayAdapter com AlertDialog e .setAdapter
  • Como adicionair um evento no Google Agenda da atividade?
  • One Solution collect form web for “Misture duas texturas com diferentes coordenadas e tamanhos no mesmo sombreador”

    Se eu entender seu problema corretamente, você deviewia estair bem calculando

     uniform vec2 texelSize; // (1.0/windowResolution.x, 1.0/windowResolution.y) vec2 uv = gl_FragCoord.xy * texelSize; vec4 backgroundColor = texture2D(u_backgroundTexture, uv); 

    A vairiável gl_FragCoord.xy "contém os valores da coordenada relativa da window (x, y, z, 1 / w) paira o fragment" ( https://www.opengl.org/sdk/docs/man/html/gl_FragCoord .xhtml ). Uma vez que você basicamente precisa das coordenadas da textura do fragment como se fosse pairte de uma quadra de canvas cheia, isso deviewia dair-lhe os resultados esperados. Você só precisa passair o tamanho relativo de um text em canvas cheia como um uniforme (veja a pairte comentada paira o cálculo).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.