首页 > 解决方案 > 如何从java将触摸坐标传递给片段着色器?

问题描述

我是 Opengl 的新手,我目前正在使用片段着色器通过触摸效果更改图像的某些像素颜色,但我不知道如何将触摸坐标从 java 传递给片段着色器。

标签: androidopengl-esglsl

解决方案


解决方案是使用统一变量。这些是变量,其值在 Java 中设置。但是,它们可以在 GLSL 着色器程序中访问。

着色器类的示例:

private int programId;
private int vertexShaderId;
private int fragmentShaderId;

private int uniformLocation_touchCoordinates;

public MyShader(String vertexShader, String fragmentShader) {
    vertexShaderId = //load vertex shader;
    fragmentShaderId = //load fragment shader;

    programId = glCreateProgram();
    glAttachShader(programId, vertexShaderId);
    glAttachShader(programId, fragmentShaderId);

    //bind in variables of the vertex shader here

    glLinkProgram(programId);
    glValidateProgram(programId);

    //init uniform variables
    uniformLocation_touchCoordinates = glGetUniformLocation(programId, "touchCoordinates");
}
public void bind() {
    glUseProgram(programId);
}
public void unbind() {
    glUseProgram(0);
}

public void loadTouchCoordinates(float x, float y) {
    glUniform2f(uniformLocation_touchCoordinates, x, y);
}

片段着色器:

//version tag, input and output variables

uniform vec2 touchCoordinates;

void main(void) {
    //...
}

用法:

public class Renderer {
    MyShader shader = new MyShader(..., ...); //pass shader code

    public void render() {
        shader.bind();

        //update uniform variable with your data
        shader.loadTouchCoordinates(..., ...); //pass coordinates

        //do your render logic here

        shader.unbind();
    }
}

推荐阅读