【问题标题】:How to pass touch coordinates to fragment shader from java?如何从java将触摸坐标传递给片段着色器?
【发布时间】:2019-05-05 07:26:58
【问题描述】:

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

【问题讨论】:

  • 我支持你,因为问题就是兴趣。如果您想快速回答,您需要提供一些代码源尝试...
  • 这是我更新的问题@NikolaLukic 请帮我这样做。 stackoverflow.com/questions/56087305/…

标签: android opengl-es glsl


【解决方案1】:

解决方案是使用统一变量。这些是变量,其值在 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();
    }
}

【讨论】:

  • 感谢您的回答,我一定会尝试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2015-11-20
  • 2014-11-02
相关资源
最近更新 更多