Drehen, Verschieben und Skalieren einer Maske in einem Shader

7

Ich möchte eine Maske in einem Shader drehen, verschieben oder skalieren. Aber ich habe keine Ahnung, wie diese Aktionen ausgeführt werden.

Mein Code:

@Override
public void create() {        
batch = new SpriteBatch();

background = new Texture(Gdx.files.internal("images/background.png"));
spritebackgournd = new Sprite(background,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());

foreground = new Texture(Gdx.files.internal("images/foreground.png"));
mask = new Texture(Gdx.files.internal("images/mask.png"));

 spriteforegournd = new Sprite(foreground,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());        

shader = new ShaderProgram(Gdx.files.internal("shaders/shader1.vert"), Gdx.files.internal("shaders/shader1.frag"));
}

@Override
public void render() {        


batch.begin();
spritebackgournd.draw(batch);
 batch.setShader(shader);
    Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE0);
    spriteforegournd.getTexture().bind(0);
    //texture.bind(0);
    shader.setUniformi("u_texture", 0);
    Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE1);
    //spritemask.getTexture().bind(1);
    mask.bind(1);
    shader.setUniformi("u_mask", 1);
    Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE0);
    spriteforegournd.draw(batch);
    batch.end();
    batch.setShader(null);
   }

Der Vertex-Shader:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec2 v_texCoords;

void main() {
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
}

Der Fragment-Shader:

varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform sampler2D u_mask;
uniform mat4 u_projTrans;

void main() {
vec4 texColor = texture2D(u_texture, v_texCoords);
vec4 maskColor = texture2D(u_mask, v_texCoords);

gl_FragColor = texColor * maskColor.a;
}

Geben Sie hier die Bildbeschreibung ein

Ich möchte in der Lage sein, die Maske im Shader zu skalieren, zu drehen und zu bewegen. Wie kann ich das machen?

user886550
quelle

Antworten:

1

Als ich darauf stieß, hat mich dieses Tutorial gerettet. Google rettet Leben. Mehrere Textureinheiten

Das meiste davon kommt von dort. Sie haben einen Vordergrund, einen Hintergrund und eine Maske.

Versuchen Sie also, die Alpha-Ebene der Maske zu erhalten, und verwenden Sie "Mix".

//get the mask; we will only use the alpha channel
float mask = texture2D(u_mask, vTexCoord).a;

//interpolate the colours based on the mask
gl_FragColor = vColor * mix(texColor0, texColor1, mask);

Ihr Code würde also so aussehen:

//"in" attributes from our vertex shader
varying vec4 vColor;
varying vec2 vTexCoord;


//our different texture units
uniform sampler2D u_texture; //default GL_TEXTURE0, expected by SpriteBatch
uniform sampler2D u_texture1; 
uniform sampler2D u_mask;

void main(void) {
    //sample the colour from the first texture
    vec4 texColor0 = texture2D(u_texture, vTexCoord);

    //sample the colour from the second texture
    vec4 texColor1 = texture2D(u_texture1, vTexCoord);

    //get the mask; we will only use the alpha channel
    float mask = texture2D(u_mask, vTexCoord).a;

    //interpolate the colours based on the mask
    gl_FragColor = vColor * mix(texColor0, texColor1, mask);
}

Zum Skalieren können Sie die Texturkoordinaten skalieren. Sie liegen im Bereich von 0-1, also habe ich Folgendes gefunden, wenn Sie von der Mitte der Textur aus skalieren möchten:

    texCoords = (texCoords - 0.5) * scale + (0.5 * scale);
Pookie
quelle
Von Antworten nur auf Links wird in StackExchange abgeraten. Wenn dieser Tutorial-Link jemals unterbrochen wird, wird diese Antwort unbrauchbar. Bitte versuchen Sie, genügend Informationen in den Text Ihrer Antwort aufzunehmen, damit ein Leser die von Ihnen vorgeschlagene Lösung verstehen kann, und verwenden Sie Links, um bei Bedarf weitere Informationen / Kontexte / Gutschriften bereitzustellen.
DMGregory
Vielen Dank für weitere Informationen. Sie haben jedoch nicht gezeigt, wie Sie die Maskentextur drehen, verschieben oder skalieren können. Ich glaube nicht, dass dies die Frage beantwortet.
DMGregory
2
Dieses Bit sieht etwas seltsam aus: (texCoords - 0.5) * scale + (0.5 * scale)ist gleich nur texCoords * scale- ist das beabsichtigt? Dieser Antwort fehlt noch die Übersetzung und Rotation.
DMGregory
2
Was ich meine ist, dass die spezielle Formel, die Sie verwendet haben , nicht von der Mitte aus skaliert. Die Werte -0,5 und +0,5 werden aufgehoben (zur Bestätigung die Multiplikation verteilen). Vielleicht wollten Sie die zweite * scaledort weglassen ? Hier gibt es keine Eile - es ist eine alte Frage - wir können uns die Zeit nehmen, um die Details richtig zu machen.
DMGregory
1
@ Luke Gibt es ein Update darüber, worüber DMGregory gesprochen hat?
Wann