我可以在哪里更改着色器制服并调用GL函数?

时间:2015-11-10 13:07:41

标签: java android opengl-es opengl-es-2.0 shader

我只是想用GLSurfaceView编写简单的Android应用程序,但我有一个问题。 我写了一个简单的着色器程序蚂蚁放一个float参数。这是我的

顶点着色器:

        attribute vec2 vPosition;
        attribute vec2 vTexCoord;
        varying vec2 texCoord;

        void main(){
           texCoord = vTexCoord;
           gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0, 1.0 );
        }

片段着色器:

        precision mediump float;
        uniform samplerExternalOES sTexture;
        uniform float myParam;
        varying vec2 texCoord;

        void main(){
          gl_FragColor = texture2D(sTexture,texCoord);
          gl_FragColor.r = gl_FragColor.r*myParam.x;
        }

一切都很棒。

我有句柄可以访问myParam(int paramHandle - 我的班级成员。):

        public void onSurfaceCreated(....){
          ....
          paramHandle= GLES20.glGetUniformLocation(shaderProgram,"myParam");
          ....
        }

现在我要变量myParam并观察屏幕上的图像会发生什么。对于这项任务,我需要致电:

 GLES20.glUseProgram(myShaderProgram);
 GLES20.glUniform1f(paramHandle, new_value);

所以:如果我试图改变这些函数内部的myParam值:

onSurfaceCreated(...),onSurfaceChanged(...)或onDrawFrame(...)

我可以在屏幕上看到此更改,因此我觉得myParam值已更改。

但是如果我想使用按钮设置maParam值,例如在单击按钮时调用函数 setMyParamValue

    public void setMyParamValue(float newValue){
      GLES20.glUseProgram(myShaderProgram);
      GLES20.glUniform1f(paramHandle, new_value);
    }

似乎没有任何反应。

有人可以解释一下它的运作方式吗?为什么我不能在我的函数中设置统一值?

1 个答案:

答案 0 :(得分:1)

渲染发生在与传递UI事件的位置不同的线程上。 openGL调用应该只从渲染线程发生。

您应该将这些调用转发给您传递给queueEvent的运行状态:

public void setMyParamValue(final float newValue){
    queueEvent(new Runnable(){
        public void run(){
           GLES20.glUseProgram(myShaderProgram);
           GLES20.glUniform1f(paramHandle, new_value);
        }
    });
}

run()内的代码将在渲染线程中执行。