Xoay, di chuyển và nhân rộng một mặt nạ trong một shader


7

Tôi muốn xoay, di chuyển hoặc thu nhỏ mặt nạ trong một shader. Nhưng tôi không có manh mối về cách thực hiện những hành động này.

Mã của tôi:

@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);
   }

Các shader đỉnh:

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;
}

Các shader mảnh:

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;
}

nhập mô tả hình ảnh ở đây

Những gì tôi muốn có thể là mở rộng quy mô, xoay và di chuyển mặt nạ trong shader. Tôi có thể làm cái này như thế nào?

Câu trả lời:


1

Khi tôi đang chạy vào đây, hướng dẫn này đã cứu tôi. Google cứu mạng. Nhiều đơn vị kết cấu

Hầu hết điều này đến từ đó. Bạn có tiền cảnh, hậu cảnh và mặt nạ.

Vì vậy, hãy thử lấy lớp alpha của mặt nạ và sử dụng '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);

Vì vậy, mã của bạn sẽ trông như thế này:

//"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);
}

Để chia tỷ lệ, bạn có thể chia tỷ lệ thông qua các tọa độ kết cấu. Chúng nằm trong phạm vi từ 0-1, vì vậy đây là những gì tôi tìm thấy nếu bạn muốn chia tỷ lệ từ trung tâm của kết cấu:

    texCoords = (texCoords - 0.5) * scale + (0.5 * scale);

Các câu trả lời chỉ liên kết không được khuyến khích trên StackExchange - nếu liên kết hướng dẫn đó bị hỏng, thì câu trả lời này sẽ trở nên vô dụng. Vui lòng cố gắng đưa đủ thông tin vào phần câu trả lời của bạn để người đọc hiểu giải pháp bạn đề xuất và sử dụng các liên kết để giúp cung cấp thêm thông tin / bối cảnh / tín dụng khi cần.
DMGregory

Cảm ơn đã bao gồm thêm thông tin. Bạn chưa chỉ ra cách xoay, di chuyển hoặc chia tỷ lệ kết cấu mặt nạ, vì vậy tôi không nghĩ điều này trả lời câu hỏi.
DMGregory

2
Bit này có vẻ hơi kỳ lạ: (texCoords - 0.5) * scale + (0.5 * scale)bằng với chỉ texCoords * scale- đây có phải là chủ ý? Câu trả lời này vẫn còn thiếu dịch và xoay.
DMGregory

2
Ý tôi là công thức cụ thể mà bạn đã sử dụng không quy mô từ trung tâm. Hủy bỏ -0,5 và +0,5 (phân phối phép nhân để xác nhận). Có lẽ bạn có nghĩa là bỏ qua thứ hai * scaleở đó? Không có gì phải vội ở đây - đó là một câu hỏi cũ - chúng ta có thể dành thời gian để có được thông tin chi tiết đúng.
DMGregory

1
@Luke Có bản cập nhật nào về DMGregory đang nói về điều gì không?
whn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.