我只是想用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);
}
似乎没有任何反应。
有人可以解释一下它的运作方式吗?为什么我不能在我的函数中设置统一值?
答案 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()
内的代码将在渲染线程中执行。