Java Android OpenGL ES 2.0:为具有相同片段着色器的对象设置唯一颜色
我在Android OpenGL ES视图中有6列。当用户触摸屏幕时,一个列会发出特定的颜色。最初,所有列都使用相同的辉光颜色,但我正在尝试编写代码,以便在触摸时为每个列提供唯一的辉光颜色 我注意到的错误是,每个列发光仍然是相同的颜色,好像我设置glUniform的调用在第一次设置后就停留在一种颜色上。setUniforms()中我的switch语句中指定的最后一种颜色是触摸所有6列时使用的颜色,而每列的颜色应该不同 我的片段着色器中是否存在导致所有列错误使用案例5的mGlowColorHandle值的错误?在我的方法中是否有错误 OpenGL\u GLRenderer.javaJava Android OpenGL ES 2.0:为具有相同片段着色器的对象设置唯一颜色,java,android,opengl-es,Java,Android,Opengl Es,我在Android OpenGL ES视图中有6列。当用户触摸屏幕时,一个列会发出特定的颜色。最初,所有列都使用相同的辉光颜色,但我正在尝试编写代码,以便在触摸时为每个列提供唯一的辉光颜色 我注意到的错误是,每个列发光仍然是相同的颜色,好像我设置glUniform的调用在第一次设置后就停留在一种颜色上。setUniforms()中我的switch语句中指定的最后一种颜色是触摸所有6列时使用的颜色,而每列的颜色应该不同 我的片段着色器中是否存在导致所有列错误使用案例5的mGlowColorHand
public class OpenGL_GLRenderer implements GLSurfaceView.Renderer {
@Override
public void onDrawFrame(GL10 glUnused) {
GLES20.glUseProgram(neckProgramHandle);
setUniforms(neckProgramHandle);
...
}
private void setUniforms(int programHandle)
{
mGlowColorHandle = GLES20.glGetUniformLocation(programHandle, "stringGlowColor"); //column glow color
//************************String Glow code*******************************
//if user's touching the screen, make nearest string glow
for (int i = 0; i< 6; i++) {
if (stringGlowEffects[i] != null) {
float top = orthoTop + (orthoBottom-orthoTop)*stringGlowEffects[i].y + scroller.getCurrentValue();
GLES20.glUniform2f(mGlowPosHandles[i], stringGlowEffects[i].x, top);
float aRandomFloat = (float) (Math.random() * 100); //generate random number from 0-99
float glowEffectScale = 1.0f + (aRandomFloat - 50.0f) / 300.0f;
GLES20.glUniform1f(mGlowScaleHandles[i], glowEffectScale); //ERROR HERE: case 5's color is displayed for every column
switch (i){
case 0:
GLES20.glUniform4f(mGlowColorHandle,.0f, .0f, 1.0f, 1.0f);
case 1:
GLES20.glUniform4f(mGlowColorHandle,.0f, 1.0f, .0f, 1.0f);
case 2:
GLES20.glUniform4f(mGlowColorHandle,1.0f, .0f, .0f, 1.0f);
case 3:
GLES20.glUniform4f(mGlowColorHandle,.0f, 1.0f, 1.0f, 1.0f);
case 4:
GLES20.glUniform4f(mGlowColorHandle,1.0f, 1.0f, .0f, 1.0f);
case 5:
GLES20.glUniform4f(mGlowColorHandle,1.0f, .0f, 1.0f, 1.0f);
}
}
else{
GLES20.glUniform1f(mGlowScaleHandles[i], 0.0f);
}
}
}
}
在
switch
语句中每次调用GLES20.glUniform4f
后,都需要一个break
语句。当您的程序输入一个开关
语句时,它会跳到相应的大小写
标签,并继续运行,直到它碰到一个中断
语句或开关
的末尾,即使它经过了另一个大小写
标签。这有时是有用的,但大多只是让人困惑。啊,是的,简单的错误。谢谢
uniform sampler2D u_Texture; // The input texture.
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment.
uniform vec4 stringGlowColor; // color of the string (column)
// The entry point for our fragment shader.
void main(){
...
lowp vec4 fromTexture = texture2D(u_Texture, v_TexCoordinate);
gl_FragColor = fromTexture + stringGlowColor*effectScale;
}