Решение состоит в том, чтобы использовать однородные переменные.Это переменные, значения которых установлены в 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);
}
fragShader:
//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();
}
}